Java線程(上)_第1頁
Java線程(上)_第2頁
Java線程(上)_第3頁
Java線程(上)_第4頁
Java線程(上)_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、Java線程(上)線程(上)ID:SCSJ002-J2SEJava線程(上)線程(上)v線程概述線程概述vJava線程模型線程模型v創(chuàng)建線程創(chuàng)建線程v后臺線程(守護線程)后臺線程(守護線程)v線程的線程的join()方法方法2011-05-032線程概述線程概述v多進程:在操作系統(tǒng)中能(同時)運行多個任務(wù)多進程:在操作系統(tǒng)中能(同時)運行多個任務(wù)(程序程序)v多線程:在同一應(yīng)用程序中有多個順序流(同時)多線程:在同一應(yīng)用程序中有多個順序流(同時)執(zhí)行執(zhí)行2011-05-033Java線程模型線程模型v 虛擬的虛擬的CPU,由,由java.lang.Thread類封裝和虛擬類封裝和虛擬CPU來實

2、現(xiàn)。來實現(xiàn)。v CPU所執(zhí)行的代碼,傳遞給所執(zhí)行的代碼,傳遞給Thread類對象。類對象。v CPU所處理的數(shù)據(jù),傳遞給所處理的數(shù)據(jù),傳遞給Thread類對象。類對象。代 碼數(shù) 據(jù)虛擬CPUJava線程模型2011-05-034創(chuàng)建線程創(chuàng)建線程v 通過通過java.lang.Thread來創(chuàng)建一個線程來創(chuàng)建一個線程v Thread的構(gòu)造器:的構(gòu)造器: Thread() Thread(Runnable target) Thread(Runnable target, String name) Thread(String name) Thread(ThreadGroup group, Runnabl

3、e target) Thread(ThreadGroup group, Runnable target, String name) Thread(ThreadGroup group, String name) 2011-05-035啟動線程啟動線程v 每個線程都是通過某個特定每個線程都是通過某個特定ThreadThread對象所對應(yīng)的方法對象所對應(yīng)的方法run( )run( )來完成其操作的,來完成其操作的,方法方法run( )run( )稱為線程體。稱為線程體。v 使用使用start()start()方法方法,線程進入,線程進入RunnableRunnable(可運行)狀態(tài),(可運行)狀態(tài),

4、它將向線程調(diào)度器注冊這個線程。它將向線程調(diào)度器注冊這個線程。v 調(diào)用調(diào)用start()start()方法方法并不一定馬上會執(zhí)行這個線程并不一定馬上會執(zhí)行這個線程,正如,正如上面所說,它只是進入上面所說,它只是進入RunnableRunnable 而不是而不是RunningRunning。v 注意,不要直接在程序中調(diào)用線程的注意,不要直接在程序中調(diào)用線程的run()run()方法。方法。2011-05-036創(chuàng)建并啟動線程例子創(chuàng)建并啟動線程例子public classpublic class TestThreadTestThread extendsextends ThreadThread pub

5、lic voidpublic void run() run()forfor( (intint i = 0; i 100; i+) i = 0; i 100; i+) SystemSystem.out.println(.out.println(Count:Count:+i);+i); public static voidpublic static void main( main(StringString args) args)TestThreadTestThread tt = tt = new new TestThreadTestThread();();/注意,不要直接調(diào)用注意,不要直接調(diào)用ru

6、nrun方法方法tt.start();tt.start(); 2011-05-037創(chuàng)建線程的另一種方式創(chuàng)建線程的另一種方式v通過實現(xiàn)通過實現(xiàn)Runnable接口并實現(xiàn)接口中定義的唯接口并實現(xiàn)接口中定義的唯一方法一方法run(),可以創(chuàng)建一個線程,可以創(chuàng)建一個線程public class TestThreadTestThread implements Runnable public void run() for(int i = 0; i 100; i+) SystemSystem.out.println(Count:+i); public static void main(StringStri

7、ng args) TestThreadTestThread tt = new TestThreadTestThread(); ThreadThread t = new ThreadThread(tt); t.start();2011-05-038兩種線程創(chuàng)建方式的比較兩種線程創(chuàng)建方式的比較v 使用使用Runnable接口接口 可以將CPU,代碼和數(shù)據(jù)分開,形成清晰的模型; 還可以從其他類繼承; 保持程序風(fēng)格的一致性。v 直接繼承直接繼承Thread類類 不能再從其他類繼承; 編寫簡單,可以直接操縱線程,無需使用Thread.currentThread()。2011-05-039結(jié)束線程結(jié)束線程

8、v線程會以以下三種方式之一結(jié)束:線程會以以下三種方式之一結(jié)束: 線程到達其 run() 方法的末尾; 線程拋出一個未捕獲到的 Exception 或 Error;/下面線程何時結(jié)束?public class TestThreadTestThread implements Runnable public void run() for(int i = 0; i 100; i+) SystemSystem.out.println(Count:+i); 2011-05-0310后臺線程后臺線程v有一種線程,它是在后臺運行的,它的任務(wù)是為有一種線程,它是在后臺運行的,它的任務(wù)是為其他的線程提供服務(wù),這種

9、線程被稱為其他的線程提供服務(wù),這種線程被稱為后臺線后臺線程(程(Daemon Thread),又稱為,又稱為守護線程守護線程public static void main(StringString args) TestThreadTestThread tt = new TestThreadTestThread(); ThreadThread t = new ThreadThread(tt); /設(shè)置為后臺線程,主線程結(jié)束,后臺線程自動結(jié)束。設(shè)置為后臺線程,主線程結(jié)束,后臺線程自動結(jié)束。 t.setDaemon(t.setDaemon(truetrue); ); t.start();2011-0

10、5-0311線程的線程的join方法方法vThread API 包含了等待另一個線程完成的方包含了等待另一個線程完成的方法:法:join() 方法。當調(diào)用方法。當調(diào)用 Thread.join() 時,時,調(diào)用線程將阻塞,直到被調(diào)用線程將阻塞,直到被join方法加入的目標線方法加入的目標線程完成為止。程完成為止。 vThread.join() 通常由使用線程的程序調(diào)用,通常由使用線程的程序調(diào)用,以將大問題劃分成許多小問題,每個小問題分配以將大問題劃分成許多小問題,每個小問題分配一個線程。當所有的小問題都得到處理后,再調(diào)一個線程。當所有的小問題都得到處理后,再調(diào)用主線程來進一步操作。用主線程來進一

11、步操作。2011-05-0312join方法例子方法例子public classpublic class Key2FileKey2File extends extends ThreadThread StringString path; path; publicpublic Key2FileKey2File( (StringString path) path) thisthis.path = path.path = path public voidpublic void run() run() forfor( (intint i = 0; i 100; i+) i = 0; i 100; i+)

12、 ThreadThread.sleep(1000); .sleep(1000); /休息休息10001000毫秒毫秒 StringString name = name = StringString.format(.format(“%s/%d.txt”“%s/%d.txt”, , path, i); path, i); OutputStream OutputStream out = out = newnew FileOutputStreamFileOutputStream(name);(name); out.write( out.write(“hello”“hello”.getBytes();.

13、getBytes(); out.close(); out.close(); publicpublic staticstatic voidvoid main(String args) trytry Key2File k = newnew Key2File10; for for(intint i = 1; i = 10; i+) ki-1 = newnew Key2File(d:tempd“ + i + ); ki-1.start(); for for(intint i = 1; i = 10; i+) ki-1.join();ki-1.join(); catchcatch (Interrupte

14、dException e) e.printStackTrace(); System.out.println(文件創(chuàng)建完成。);2011-05-0313線程的簡單控制線程的簡單控制v 測試線程是否正處于測試線程是否正處于Runnable狀態(tài)狀態(tài) isAlive()v 中斷線程中斷線程 Thread.sleep() Thread.yield()v 設(shè)置線程的優(yōu)先級設(shè)置線程的優(yōu)先級 getPriority() setPriority()2011-05-0314線程狀態(tài)線程狀態(tài)RunnableRunningBlockedNewstart()run() 運行完畢線程調(diào)度阻塞事件解除阻塞Dead2011-

15、05-0315與線程控制有關(guān)的方法與線程控制有關(guān)的方法start() 新建的線程進入Runnable狀態(tài)run() 線程進入Running 狀態(tài) wait()線程進入等待狀態(tài),等待被notify,這是一個對象方法,而不是線程方法notify()/notifyAll()喚醒其他的線程,這是一個對象方法,而不是線程方法 yield()線程放棄執(zhí)行,使其他優(yōu)先級不低于此線程的線程有機會運行,它是一個靜態(tài)方法getPriority()/setPriority()獲得/設(shè)置線程優(yōu)先級sleep()線程睡眠指定的一段時間join()調(diào)用這個方法的主線程,會等待加入的子線程完成2011-05-0316作業(yè):作業(yè):v主線程接受鍵盤輸入主線程接受鍵盤輸入,子線程每子線程每1秒鐘一次,判斷秒鐘一次,判斷指定的某個目錄下的某個文件是否被修改,如果指定的某個目錄下的某個文件是否被修改,如果被修改,就在被修改,就在Console上打印出上打印出“File changed”v將一個將一個500M的文件,用的文件,用4個線程搬運到另外一個線程搬運到另外一個文件目錄里去。個文件目錄里去。v查看一個目錄,根據(jù)文件的數(shù)目,啟動相應(yīng)的線查看一個目錄,根據(jù)文件的數(shù)目,啟動相應(yīng)的線程數(shù),將文件拷貝到另外一個目錄里面去。程數(shù),將文件拷貝到

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論