CH7-Java多線程編程.ppt_第1頁
CH7-Java多線程編程.ppt_第2頁
CH7-Java多線程編程.ppt_第3頁
CH7-Java多線程編程.ppt_第4頁
CH7-Java多線程編程.ppt_第5頁
已閱讀5頁,還剩27頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、Java多線程編程,第7章,2,7.1 引言和本章任務,線程和進程的概念以及二者的聯系和區(qū)別; Java語言如何創(chuàng)建多線程? Java語言支持的線程狀態(tài)有哪些?這些狀態(tài)之間是如何變遷的? 線程優(yōu)先級在Java語言中是如何規(guī)定和實現的? 線程同步機制:synchronized保留字的使用、wait-notify機制等。,3,7.2 基礎知識鏈接,4,7.2.1 線程與進程,進程是指一種“自包容”的運行程序,有自己的地址空間。 與進程相關的數據結構通常稱為進程控制塊(Process Control Block),進程控制塊掌握著所有與內存相關的東西:全局地址空間、文件句柄等等諸如此類的東西。 線程

2、和進程其實都是操作系統(tǒng)內部的一種數據結構,5,線程與進程(2),線程的數據結構與進程相反,僅僅只包括執(zhí)行這些指令的信息。它包含當前的運行上下文(context):如寄存器(register)的內容、當前指令在運行過程中的指令流中的位置、方法的本地參數和變量的運行時堆棧。 線程是一個能獨立執(zhí)行自身指令的控制流,但是線程本身不能單獨運行 運行時堆棧就是內存的一塊用來存儲本地變量和參數的區(qū)域,該區(qū)域是線程數據結構一部分。,6,7.2.2 Java線程創(chuàng)建方式 2-1,通過以下兩種方法創(chuàng)建 Thread 對象: - 聲明一個 Thread 類的子類,并覆蓋 run() 方法。 class mythre

3、ad extends Thread public void run( ) /* 覆蓋該方法*/ - 聲明一個實現 Runnable 接口的類,并實現 run() 方法。 class mythread implements Runnable public void run( ) /* 實現該方法*/ ,7,Java線程創(chuàng)建方式 2-2,要觸發(fā)一個新線程,使用 start() 方法,如: Mythread t = new Mythread(); t.start(); 在調用 start() 方法時,將創(chuàng)建一個新的控制線程,接著它將調用 run() 方法。 run() 方法中的代碼定義執(zhí)行線程所需的

4、功能。,8,創(chuàng)建線程示例,class MyThread1 extends Thread public static void main(String args) Thread t= Thread.currentThread(); System.out.println(主線程是: +t); MyThread1 ex = new MyThread1(); ex.start(); public void run() System.out.println(子線程是:+this); ,或者使用 implements Runnable,9,Thread 類的定義和常量,Thread類的定義 public

5、class Thread extends Object implements Runnable Thread類定義的常量 publicstaticfinalint MAX_PRIORITY 10 publicstaticfinalint MIN_PRIORITY 1 publicstaticfinalint NORM_PRIORITY 5,10,Thread 類的構造方法,Thread類的構造方法: Thread() Thread(Runnabletarget)/ Thread(Runnabletarget,Stringname) /target所指定的run方法將被調用,指定線程名 Thre

6、ad(Stringname) / Thread(ThreadGroupgroup,Runnabletarget) /線程組, Thread(ThreadGroupgroup,Runnabletarget,String name) / Thread(ThreadGroupgroup,Runnabletarget,String name,longstackSize) /指定所需的堆棧大小,不指定則為0,11,Thread 類中的重要方法 2-1,12,Thread 類中的重要方法 2-2,13,7.2.3 Java線程狀態(tài)與生命周期,Java線程狀態(tài) 可能使線程暫停執(zhí)行的條件,14,線程的狀態(tài) 4

7、-1,新建 (Born) : 新建的線程處于新建狀態(tài) 就緒 (Ready) : 在創(chuàng)建線程后,它將處于就緒狀態(tài),等待 start() 方法被調用 運行 (Running) : 線程在開始執(zhí)行時進入運行狀態(tài) 睡眠 (Sleeping) : 線程的執(zhí)行可通過使用 sleep() 方法來暫時中止。在睡眠后,線程將進入就緒狀態(tài),15,線程的狀態(tài)4-2,等待 (Waiting) : 如果調用了 wait() 方法,線程將處于等待狀態(tài)。用于在兩個或多個線程并發(fā)運行時。 掛起 (Suspended) : 在臨時停止或中斷線程的執(zhí)行時,線程就處于掛起狀態(tài)。 恢復 (Resume) : 在掛起的線程被恢復執(zhí)行時

8、,可以說它已被恢復。,16,阻塞 (Blocked) 在線程等待一個事件時(例如輸入/輸出操作),就稱其處于阻塞狀態(tài)。 死亡 (Dead) 在 run() 方法已完成執(zhí)行或其 stop() 方法被調用之后,線程就處于死亡狀態(tài)。,線程狀態(tài)4-3,17,線程的狀態(tài) 4-4,18,可能使線程暫停執(zhí)行的條件,線程: 線程優(yōu)先級比較低,因此它不能獲得 CPU 時間。 使用 sleep( ) 方法使線程睡眠。 通過調用 wait( ) 方法,使線程等待。 通過調用 yield( ) 方法,線程已顯式出讓CPU控制權。 線程由于等待一個文件I/O事件被阻塞。,19,線程狀態(tài)的示例,class ThreadS

9、tateDemo extends Thread Thread t; public ThreadStateDemo() t=new Thread(this); System.out.println (線程 t 為新建!); System.out.println (線程 t 為就緒!); t.start(); public void run() try System.out.println (線程 t 在運行!); t.sleep(500); System.out.println(線程 t 在短時間睡眠后重新運行!); catch (InterruptedException IE) System.

10、out.println(線程被中斷); ,public static void main(String args) new ThreadStateDemo(); ,20,7.2.4 Java線程優(yōu)先級,Java 中的線程優(yōu)先級是在 Thread 類中定義的常量 NORM_PRIORITY : 值為 5 MAX_PRIORITY : 值為 10 MIN_PRIORITY : 值為 1 缺省優(yōu)先級為 NORM_PRIORITY 有關優(yōu)先級的方法有兩個: final void setPriority(int newp) : 修改線程的當前優(yōu)先級 final int getPriority() : 返

11、回線程的優(yōu)先級,21,7.2.5 Java線程同步機制,有時兩個或多個線程可能會試圖同時訪問一個資源 例如,一個線程可能嘗試從一個文件中讀取數據,而另一個線程則嘗試在同一文件中修改數據 在此情況下,數據可能會變得不一致 為了確保在任何時間點一個共享的資源只被一個線程使用,使用了“同步”,22,如何在 Java 中獲得同步,同步基于“監(jiān)視器”這一概念?!氨O(jiān)視器”是用作互斥鎖的對象。在給定時刻,只有一個線程可以擁有監(jiān)視器。 Java中所有的對象都擁有自己的監(jiān)視器 兩種方式實現同步: 使用同步方法 synchronized void methodA() 使用同步塊 synchronized(obje

12、ct) /要同步的語句 ,23,同步方法,class One synchronized void display(int num) System.out.print(+num); try Thread.sleep(1000); catch(InterruptedException e) System.out.println(中斷); System.out.println( 完成); ,進入某一對象的監(jiān)視器,就是調用被synchronized關鍵字修飾的方法。,class Two implements Runnable int number; One one; Thread t; public

13、Two(One one_num, int n) one=one_num; number=n; t=new Thread(this); t.start(); public void run() one.display(number); ,public class Synch public static void main(String args) One one=new One(); int digit=10; Two s1=new Two(one,digit+); Two s2=new Two(one,digit+); Two s3=new Two(one,digit+); s1.t.join

14、(); s2.t.join(); s3.t.join(); ,24,同步塊,如果無法在相關方法前加synchronized 修飾符,只需將對這個類定義的方法的調用放入一個synchronized 塊內就可以了。,class One void display(int num) System.out.print(+num); try Thread.sleep(1000); catch(InterruptedException e) System.out.println(中斷); System.out.println( 完成); ,class Two implements Runnable int

15、number; One one; Thread t; public Two(One one_num,int n) one=one_num; number=n; t=new Thread(this); t.start(); public void run() synchronized(one) one.display(number); ,25,7.3 案例7及其分析:時鐘顯示,具體分析見書上,26,7.4 擴展知識,27,7.4.1 管程機制 2-1,為避免輪流檢測,Java提供了一個精心設計的線程間通信機制,使用wait()、notify()和notifyAll()方法 。 這些方法是作為 O

16、bject 類中的 final 方法實現的。 這三個方法僅在 synchronized 方法中才能被調用。,28,管程機制 2-2,wait()方法告知被調用的線程退出監(jiān)視器并進入等待狀態(tài),直到其他線程進入相同的監(jiān)視器并調用 notify( ) 方法。 notify( ) 方法通知同一對象上第一個調用 wait( )線程。 notifyAll() 方法通知調用 wait() 的所有線程,具有最高優(yōu)先級的線程將先運行。,29,管程機制示例,class ChopStick extends Thread boolean available; ChopStick() available=true; p

17、ublic synchronized void takeup() /取走筷子準備就餐 while(!available) try System.out.println(哲學家等待筷子); wait(); catch(InterruptedException e) available=false; System.out.println(哲學家狀態(tài):就餐); public synchronized void putdown() /哲學家就餐后放下筷子 available=true; System.out.println(哲學家狀態(tài):思考); notify(); public void run() takeup(); putdown(); ,30,管程機制示例,public class ChopStickTest private static ChopStick phi = new ChopStick5; public static void main(String args) for(int i=0;i5;i+) phii=

溫馨提示

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

評論

0/150

提交評論