




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、Java 多線程編程Java給多線程編程提供了內置的支持。一個多線程程序包含兩個或多個能并發(fā)運行的部分。程序的每一部分都稱作一個線程,并且每個線程定義了一個獨立的執(zhí)行路徑。多線程是多任務的一種特別的形式,但多線程使用了更小的資源開銷。這里定義和線程相關的另一個術語 - 進程:一個進程包括由操作系統(tǒng)分配的內存空間,包含一個或多個線程。一個線程不能獨立的存在,它必須是進程的一部分。一個進程一直運行,直到所有的非守候線程都結束運行后才能結束。多線程能滿足程序員編寫高效率的程序來達到充分利用CPU的目的。一個線程的生命周線程經過其生命周期的各個階段。下圖顯示了一個線程完整的生命周期。· 新建
2、狀態(tài):使用 new 關鍵字和 Thread 類或其子類建立一個線程對象后,該線程對象就處于新建狀態(tài)。它保持這個狀態(tài)直到程序 start() 這個線程。· 就緒狀態(tài):當線程對象調用了start()方法之后,該線程就進入就緒狀態(tài)。就緒狀態(tài)的線程處于就緒隊列中,要等待JVM里線程調度器的調度。· 運行狀態(tài):如果就緒狀態(tài)的線程獲取 CPU 資源,就可以執(zhí)行 run(),此時線程便處于運行狀態(tài)。處于運行狀態(tài)的線程最為復雜,它可以變?yōu)樽枞麪顟B(tài)、就緒狀態(tài)和死亡狀態(tài)。· 阻塞狀態(tài):如果一個線程執(zhí)行了sleep(
3、睡眠)、suspend(掛起)等方法,失去所占用資源之后,該線程就從運行狀態(tài)進入阻塞狀態(tài)。在睡眠時間已到或獲得設備資源后可以重新進入就緒狀態(tài)。· 死亡狀態(tài):一個運行狀態(tài)的線程完成任務或者其他終止條件發(fā)生時,該線程就切換到終止狀態(tài)。線程的優(yōu)先級每一個Java線程都有一個優(yōu)先級,這樣有助于操作系統(tǒng)確定線程的調度順序。Java線程的優(yōu)先級是一個整數,其取值范圍是1 (Thread.MIN_PRIORITY ) - 10 (Thread.MAX_PRIORITY )。默認情況下,每一個線程都會分配一個優(yōu)先級NORM_PRIORITY(5)。具有較高優(yōu)先級的線程對程序更重要,并且應該在低優(yōu)先級
4、的線程之前分配處理器資源。但是,線程優(yōu)先級不能保證線程執(zhí)行的順序,而且非常依賴于平臺。創(chuàng)建一個線程Java提供了兩種創(chuàng)建線程方法:· 通過實現(xiàn)Runable接口;· 通過繼承Thread類本身。通過實現(xiàn)Runnable接口來創(chuàng)建線程創(chuàng)建一個線程,最簡單的方法是創(chuàng)建一個實現(xiàn)Runnable接口的類。為了實現(xiàn)Runnable,一個類只需要執(zhí)行一個方法調用run(),聲明如下:public void run()你可以重寫該方法,重要的是理解的run()可以調用其他方法,使用其他類,并聲明變量,就像主線程一樣。在創(chuàng)建一個實現(xiàn)Runnable接口的類之后,你可以在類中實例化一個線程對
5、象。Thread定義了幾個構造方法,下面的這個是我們經常使用的:Thread(Runnable threadOb,String threadName);這里,threadOb 是一個實現(xiàn)Runnable 接口的類的實例,并且 threadName指定新線程的名字。新線程創(chuàng)建之后,你調用它的start()方法它才會運行。void start();實例下面是一個創(chuàng)建線程并開始讓它執(zhí)行的實例:/ 創(chuàng)建一個新的線程class NewThread implements Runnable Thread t; NewThread() / 創(chuàng)建第二個新線程 t = new Thread(this, "
6、;Demo Thread"); System.out.println("Child thread: " + t); t.start(); / 開始線程 / 第二個線程入口 public void run() try for(int i = 5; i > 0; i-) System.out.println("Child Thread: " + i); / 暫停線程 Thread.sleep(50); catch (InterruptedException e) System.out.println("Child interrupt
7、ed."); System.out.println("Exiting child thread."); public class ThreadDemo public static void main(String args) new NewThread(); / 創(chuàng)建一個新線程 try for(int i = 5; i > 0; i-) System.out.println("Main Thread: " + i); Thread.sleep(100); catch (InterruptedException e) System.out.
8、println("Main thread interrupted."); System.out.println("Main thread exiting."); 編譯以上程序運行結果如下:Child thread: ThreadDemo Thread,5,mainMain Thread: 5Child Thread: 5Child Thread: 4Main Thread: 4Child Thread: 3Child Thread: 2Main Thread: 3Child Thread: 1Exiting child thread.Main Threa
9、d: 2Main Thread: 1Main thread exiting.通過繼承Thread來創(chuàng)建線程創(chuàng)建一個線程的第二種方法是創(chuàng)建一個新的類,該類繼承Thread類,然后創(chuàng)建一個該類的實例。繼承類必須重寫run()方法,該方法是新線程的入口點。它也必須調用start()方法才能執(zhí)行。實例/ 通過繼承 Thread 創(chuàng)建線程class NewThread extends Thread NewThread() / 創(chuàng)建第二個新線程 super("Demo Thread"); System.out.println("Child thread: " + t
10、his); start(); / 開始線程 / 第二個線程入口 public void run() try for(int i = 5; i > 0; i-) System.out.println("Child Thread: " + i); / 讓線程休眠一會 Thread.sleep(50); catch (InterruptedException e) System.out.println("Child interrupted."); System.out.println("Exiting child thread.");
11、 public class ExtendThread public static void main(String args) new NewThread(); / 創(chuàng)建一個新線程 try for(int i = 5; i > 0; i-) System.out.println("Main Thread: " + i); Thread.sleep(100); catch (InterruptedException e) System.out.println("Main thread interrupted."); System.out.printl
12、n("Main thread exiting."); 編譯以上程序運行結果如下:Child thread: ThreadDemo Thread,5,mainMain Thread: 5Child Thread: 5Child Thread: 4Main Thread: 4Child Thread: 3Child Thread: 2Main Thread: 3Child Thread: 1Exiting child thread.Main Thread: 2Main Thread: 1Main thread exiting.Thread 方法下表列出了Thread類的一些重要
13、方法:序號方法描述1public void start()使該線程開始執(zhí)行;Java 虛擬機調用該線程的 run 方法。2public void run()如果該線程是使用獨立的 Runnable 運行對象構造的,則調用該 Runnable 對象的 run 方法;否則,該方法不執(zhí)行任何操作并返回。3public final void setName(String name)改變線程名稱,使之與參數 name 相同。4public final void setPriority(int p
14、riority) 更改線程的優(yōu)先級。5public final void setDaemon(boolean on)將該線程標記為守護線程或用戶線程。6public final void join(long millisec)等待該線程終止的時間最長為 millis 毫秒。7public void interrupt()中斷線程。8public final boolean isAlive()測試線程是否處于活動狀態(tài)。測試線程是否處于活動狀態(tài)。 上述方法是被Thread對象調用的。下面的方法是Thread類的靜態(tài)方法。序號方法描述1public static voi
15、d yield()暫停當前正在執(zhí)行的線程對象,并執(zhí)行其他線程。2public static void sleep(long millisec)在指定的毫秒數內讓當前正在執(zhí)行的線程休眠(暫停執(zhí)行),此操作受到系統(tǒng)計時器和調度程序精度和準確性的影響。3public static boolean holdsLock(Object x)當且僅當當前線程在指定的對象上保持監(jiān)視器鎖時,才返回 true。4public static Thread currentThread()返回對當前正在執(zhí)行的線程對象的引用。5public static void dumpStack()將當前線程的堆棧跟蹤打印
16、至標準錯誤流。實例如下的ThreadClassDemo 程序演示了Thread類的一些方法:/ 文件名 : DisplayMessage.java/ 通過實現(xiàn) Runnable 接口創(chuàng)建線程public class DisplayMessage implements Runnable private String message; public DisplayMessage(String message) this.message = message; public void run() while(true) System.out.println(message); / 文件名 : Gues
17、sANumber.java/ 通過繼承 Thread 類創(chuàng)建線程public class GuessANumber extends Thread private int number; public GuessANumber(int number) this.number = number; public void run() int counter = 0; int guess = 0; do guess = (int) (Math.random() * 100 + 1); System.out.println(this.getName() + " guesses " +
18、 guess); counter+; while(guess != number); System.out.println("* Correct! " + this.getName() + " in " + counter + " guesses.*"); / 文件名 : ThreadClassDemo.javapublic class ThreadClassDemo public static void main(String args) Runnable hello = new DisplayMessage("Hello
19、"); Thread thread1 = new Thread(hello); thread1.setDaemon(true); thread1.setName("hello"); System.out.println("Starting hello thread."); thread1.start(); Runnable bye = new DisplayMessage("Goodbye"); Thread thread2 = new Thread(bye); thread2.setPriority(Thread.MIN_
20、PRIORITY); thread2.setDaemon(true); System.out.println("Starting goodbye thread."); thread2.start(); System.out.println("Starting thread3."); Thread thread3 = new GuessANumber(27); thread3.start(); try thread3.join(); catch(InterruptedException e) System.out.println("Thread interrupted."); System.out.println("Starting thread4."); Thread thread4 = new GuessANumber(75); thread4.start(); System.out.println("main() is ending."
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 農業(yè)保險代購合同范例
- 交貨期限合同范本
- 烏龜引種合同范例
- 磷對棉花生理特性和產量品質的影響
- 2025年熱反射玻璃(非采暖區(qū)用)項目發(fā)展計劃
- 基于基因組和重測序的大銀魚群體遺傳多樣性及環(huán)境適應性研究
- 鄉(xiāng)鎮(zhèn)房子門面出售合同范例
- 假期出游合同范例
- 共同投資經營合同范例
- 黃羽肉雞生長與繁殖拮抗性狀基因組選擇優(yōu)化方案的模擬研究
- 彩鋼瓦雨棚施工方案
- 大型國有集團公司企業(yè)年金管理委員會章程
- 四年級下冊書法教案-4《體呈偏斜重心須正》 湘美版
- 肺癌教學查房心胸外科
- 法律基礎(第4版)PPT完整全套教學課件
- 中學歷史課程標準與教材研究緒論課件
- 國際體力活動量表IPAQ中文版短卷和長卷及評分標準
- 基礎模塊2Unit 8 Green Earth reading課件
- 某發(fā)電公司安全風險辨識分級管控與隱患排查治理匯編
- 洛陽榮基礦業(yè)開發(fā)有限公司洛寧縣楊坪溝金礦礦產資源開采與生態(tài)修復方案
- 中小學教師職稱晉升水平能力測試題及答案
評論
0/150
提交評論