溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Java線程怎么用

發(fā)布時間:2021-11-03 11:35:38 來源:億速云 閱讀:134 作者:小新 欄目:編程語言

小編給大家分享一下Java線程怎么用,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

Java平臺從開始就被設(shè)計成為多線程環(huán)境。在你的主程序執(zhí)行的時候,其它作業(yè)如碎片收集和事件處理則是在后臺進行的。本質(zhì)上,你可以認為這些作業(yè)是線程。它們正好是系統(tǒng)管理線程,但是無論如何,它們是線程。線程使你能夠定義相互獨立的作業(yè),彼此之間互不干擾。系統(tǒng)將交換這些作業(yè)進或出CPU,這樣(從外部看來)它們好象是同時運行的。

在你需要在你的程序中處理多個作業(yè)時,你也可以使用多個進程。這些進程可以是你自己創(chuàng)建的,你也可以操縱系統(tǒng)線程。

你進行這些多作業(yè)處理,要使用幾個不同的類或接口:

 java.util.Timer類
 javax.swing.Timer類
 Thread類
 Runnable接口

對于簡單的作業(yè),通常需要重復(fù)的,你可以使用java.util.Timer類告訴它“每半秒鐘做一次”。注意:大多數(shù)系統(tǒng)例程是使用毫秒的。半秒鐘是500毫秒。

你希望Timer實現(xiàn)的任務(wù)是在java.util.TimerTask實例中定義的,其中運行的方法包含要執(zhí)行的任務(wù)。這些在Hi類中進行了演示,其中字符串“Hi”重復(fù)地被顯示在屏幕上,直到你按Enter鍵。

import java.util.*;   public class Hi {   public static void main(String args[])    throws java.io.IOException {  TimerTask task = new TimerTask() {  public void run() {   System.out.println("Hi");  }   };   Timer timer = new Timer();   timer.schedule(task, 0, 500);   System.out.println("Press ENTER to stop");   System.in.read(new byte[10]);   timer.cancel();  }  }

Java Runtime Environment工作的方式是只要有一個線程在運行,程序就不退出。這樣,當取消被調(diào)用,沒有其它線程在運行了,則程序退出。有一些系統(tǒng)線程在運行,如碎片收集程序。這些系統(tǒng)線程也被稱為后臺線程。后臺線程的存在不影響運行環(huán)境被關(guān)閉,只有非后臺線程保證運行環(huán)境不被關(guān)閉。

Javax.swing.Timer類與java.util.timer類的工作方式相似,但是有一些差別需要注意。***,運行的作業(yè)被ActionListener接口的實現(xiàn)來定義。第二,作業(yè)的執(zhí)行是在事件處理線程內(nèi)部進行的,而不象java.util.Timer類是在它的外部。這是很重要的,因為它關(guān)系到Swing組件集是如何設(shè)計的。

如果你不熟悉Swing,它是一組可以被Java程序使用的圖形組件。Swing被設(shè)計程被稱為單線程的。這意味著對Swing類內(nèi)部內(nèi)容的訪問必須在單個線程中完成。這個特定的線程是事件處理線程。這樣,例如你想改變Label組件的文字,你不能僅僅調(diào)用Jlabel的setText方法。相反,你必須確認setText調(diào)用發(fā)生在事件處理線程中,而這正是javax.swing.Time類派的上用場的地方。

為了說明這第二種情況,下面的程序顯示一個增加的計數(shù)器的值。美半秒鐘計數(shù)器的數(shù)值增加,并且新的數(shù)值被顯示。

import javax.swing.*;  import java.awt.*;  import java.awt.event.*;   public class Count {   public static void main(String args[]) {  JFrame frame = new JFrame();  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  Container contentPane = frame.getContentPane();  final JLabel label = new JLabel("", JLabel.CENTER);  label.setFont(new Font("Serif", Font.PLAIN, 36));  contentPane.add(label, BorderLayout.CENTER);  ActionListener listener = new ActionListener() {   int count = 0;   public void actionPerformed(ActionEvent e) {  count++;  label.setText(Integer.toString(count));   }  };  Timer timer = new Timer(500, listener);  timer.start();  frame.setSize(300, 100);  frame.show();   }  }

上述程序的結(jié)果是:

Java線程怎么用

萬一你要做的不是一個簡單的重復(fù)作業(yè),java.lang.Thread類就派上了用場。它允許你自己控制基本功能。通過創(chuàng)建Thread的一個子類,你可以使你的系統(tǒng)脫離,并進行一個長時間運行的作業(yè),如從網(wǎng)絡(luò)上讀取一個文件,而不阻礙你的其它程序的運行。這種長時間運行的作業(yè)將在run方法中定義。  更多內(nèi)容請看Java環(huán)境安裝配置、Solaris基礎(chǔ)知識入門、Java編程開發(fā)手冊專題,或進入討論組討論。

第二種方式是創(chuàng)建Thread類的子類并在子類中實現(xiàn)run方法,或在實現(xiàn)runnable的類中實現(xiàn)run方法,并將這個實現(xiàn)傳遞給Thread的構(gòu)造函數(shù)。

你可能會問有什么區(qū)別。Java編程語言僅支持單一繼承。如果你設(shè)計的調(diào)用是除了Thread以外的其它類,你可以是你的類實現(xiàn)Runnable,而它可以是你的作業(yè)被執(zhí)行。否則,你定義Thread的子類來運行你的Run方法,在處理過程中不再添加其它操作。

對于創(chuàng)建Thread子類的第三種情況,下面的程序生成了一個新的線程來計算一個特定URL的字符數(shù),這個URL是通過命令行傳遞進來的。在這進行過程之中,實現(xiàn)Runnable的第四種情況被演示,打印出重復(fù)的消息。注意在實現(xiàn)Runnable的這后一種情況下,你必須提供重復(fù)消息的代碼。你必須同時sleep,以分配時間并完成操作。在兩種情況下,與使用Timer相比較。這段程序的***一部分包含有你從命令行讀取命令以觸發(fā)程序結(jié)束。注意在系統(tǒng)讀取URL并打印消息的同時,你總可以按Enter鍵結(jié)束程序。

import java.io.*;  import java.net.*;   public class Both {   public static void main(String args[]) {  final String urlString = args[0];  final String message = args[1];  Thread thread1 = new Thread() {   public void run() {  try {   URL url = new URL(urlString);   URLConnection connection = url.openConnection();   InputStreamReader isr = new InputStreamReader(  connection.getInputStream());   BufferedReader reader = new BufferedReader(isr);   int count = 0;   while (reader.read() != -1) {   count++;   }   System.out.println("Size is : " + count);   reader.close();  } catch (MalformedURLException e) {   System.err.println("Bad URL: "+ urlString);  } catch (IOException e) {   System.err.println("I/O Problems");  }   }  };  thread1.start();  Runnable runnable = new Runnable() {   public void run() {  while(true) {   System.out.println(message);   try {  Thread.sleep(500);   } catch (InterruptedException e) {   }  }   }  };  Thread thread2 = new Thread(runnable);  thread2.start();  try {   System.out.println("Press ENTER to stop");   System.in.read(new byte[10]);  } catch (IOException e) {  System.out.println("I/O problems");   }   System.exit(0);   }  }

為有多種方式來處理線程,你選用哪種技術(shù)取決于你和你面臨的條件。要成為一個有效的Java編程人員,盡管你通常不必學習Java編程語言的所有內(nèi)容和核心庫,但是線程是一個例外。你越早了解線程如何工作和如何使用線程,你將越早了解Java程序如何工作和交互。

以上是“Java線程怎么用”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI