????? 本文是Java線程使用的入門級教程。Java平臺從開始就被設(shè)計成為多線程環(huán)境,多線程的好處在于可以充分利用處理器資源,保證更快速的完成任務(wù)。
<script src="http://www.51cto.com/js/article/keywords_ad_new.js"></script>
?
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工作的方式是只要有一個線程在運行,程序就不退出。這樣,當(dāng)取消被調(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é)果是:
萬一你要做的不是一個簡單的重復(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ā)手冊專題,或進入討論組討論。
?
?
?
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
