《Java的执行绪lno.pptx》由会员分享,可在线阅读,更多相关《Java的执行绪lno.pptx(22页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第10章 Java的執行緒10-1 執行緒的基礎10-2 Java執行緒的使用方法10-3 Java執行緒的同步10-4 管道串流的執行緒10-1 執行緒的基礎10-1-1 Java的執行緒10-1-2 多工與多執行緒10-1-1 Java的執行緒-說明執行緒(執行緒(ThreadThread)也稱為輕量行程也稱為輕量行程(Lightweight Lightweight ProcessProcess),其執行過程),其執行過程類似上述程式執行,只類似上述程式執行,只是執行緒不能單獨存在是執行緒不能單獨存在或執行,一定需要隸屬或執行,一定需要隸屬於一個程式,由程式啟於一個程式,由程式啟動執行緒,
2、如右圖所示:動執行緒,如右圖所示:10-1-1 Java的執行緒-多執行緒如果程式碼本身沒有先後依存關係,程式能夠分割成多個同步執行緒來一起執行,這種程式設計方法稱為平行程式設計(Parallel Programming),如右圖所示:10-1-2 多工與多執行緒目前的作業系統都強調多工(Multitasking)。例如:微軟的Windows作業系統屬於一套多工的作業系統,可以同時執行小畫家、記事本和小算盤等多個應用程式。不同於作業系統的多工,多執行緒(Multithreaded)是指在單一應用程式擁有多個執行流程。例如:Web瀏覽程式可以在下載網頁檔案的同時顯示動畫、播放音樂或捲動視窗瀏覽網
3、頁內容。10-2 Java執行緒的使用方法10-2-1 實作Runnable介面10-2-2 繼承Thread類別10-2 Java執行緒的使用方法Java執行緒是建立Thread類別的物件,一共有2種方式建立多執行緒應用程式,如下所示:n n實作實作實作實作RunnableRunnable介面。介面。介面。介面。n n繼承繼承繼承繼承ThreadThread類別。類別。類別。類別。10-2-1 實作Runnable介面-架構Swing應用程式繼承自JFrame,Java Applet繼承自JApplet,就只能實作Runnable介面的run()方法來建立多執行緒的應用程式,如下所示:cla
4、ss UserThread extends UserClass implements Runnable public UserThread(int length)public void run()10-2-1 實作Runnable介面-啟動接著可以建立Thread物件和啟動執行緒,如下所示:UserThread ut1=new UserThread(5);Thread t1=new Thread(ut1,執行緒A);t1.start();上述程式碼在建立好UserThread物件ut1後,使用ut1物件建立Thread物件的執行緒,參數字串是執行緒名稱,最後使用start()方法啟動執行緒。1
5、0-2-1 實作Runnable介面-建構子Thread類別的建構子,如下表所示:10-2-1 實作Runnable介面-相關方法Thread類別的相關方法,如下表所示:10-2-2 繼承Thread類別-架構若類別沒有繼承其他類別,就可以直接繼承Thread類別,然後覆寫run()方法建立執行緒物件,如下所示:class UserThread extends Threadclass UserThread extends Thread public UserThread(int length,String name)public UserThread(int length,String nam
6、e)public void run()public void run()10-2-2 繼承Thread類別-啟動接著就可以建立Thread物件,啟動執行緒,如下所示:UserThread ut1=UserThread ut1=new UserThread(5,new UserThread(5,執行緒執行緒A);A);ut1.start();ut1.start();上述程式碼在建立好UserThread物件ut1後,這是Thread物件,所以可以直接使用start()方法啟動執行緒。10-3 Java執行緒的同步-說明在第10-2節程式範例的執行緒間並沒有任何關係,簡單的說,執行緒的目的只是為了
7、加速程式執行。另一種情況是執行緒間擁有生產和消費者的關係或是同時存取相同資源,當有此情況,就需要考量同步(Synchronization)問題。10-3 Java執行緒的同步-生產者和消費者模型生產者和消費者模型(Producer/Consumer Model)生產者和消費者模型是指一個執行緒產生資料,生產者和消費者模型是指一個執行緒產生資料,稱為生產者,另一個執行緒讀取生產者產生的資稱為生產者,另一個執行緒讀取生產者產生的資料,稱為消費者,產生的資料是儲存在共用的資料,稱為消費者,產生的資料是儲存在共用的資料儲存緩衝區稱為佇列(料儲存緩衝區稱為佇列(QueueQueue),這是一),這是一種
8、先進先出的資料結構,如下圖所示:種先進先出的資料結構,如下圖所示:10-3 Java執行緒的同步-synchronized關鍵字synchronized關鍵字生產者和消費者是同步存取同一個資源物件,所以存取的enqueue()和dequeue()方法需要使用synchronized關鍵字鎖定資源,稱為同步方法(Synchronized Method),如下所示:public synchronized void enqueue(int value)public synchronized void enqueue(int value)public synchronized int dequeue(
9、)public synchronized int dequeue()10-3 Java執行緒的同步-wait()和notify()方法(說明)wait()和notify()方法同步執行緒雖然使用synchronized關鍵子避免同時存取相同物件,但是為了讓生產者產生的資料有地方儲存,且消費者能夠取得資料,有兩種情況需要特別處理,如下所示:n n佇列空了:佇列空了:佇列空了:佇列空了:如果佇列空了,消費者需要等待生如果佇列空了,消費者需要等待生產者產生資料。產者產生資料。n n佇列滿了:佇列滿了:佇列滿了:佇列滿了:如果佇列滿了,表示已經沒有地方如果佇列滿了,表示已經沒有地方儲存,生產者需要等待
10、消費者讀取資料。儲存,生產者需要等待消費者讀取資料。10-3 Java執行緒的同步-wait()和notify()方法(enqueue()方法)public synchronized void enqueue(int value)public synchronized void enqueue(int value)try /try /如果佇列已滿如果佇列已滿 while(queue.isFull()while(queue.isFull()wait();/wait();/等待等待 catch(InterruptedException e)catch(InterruptedException e)
11、queue.enqueue(value);/queue.enqueue(value);/存入存入 notify();/notify();/通知通知dequeue()dequeue()10-3 Java執行緒的同步-wait()和notify()方法(dequeue()方法)public synchronized int dequeue()public synchronized int dequeue()try /try /如果佇列已空如果佇列已空 while(queue.isEmpty()while(queue.isEmpty()wait();/wait();/等待等待 catch(Inter
12、ruptedException e)catch(InterruptedException e)int data=queue.dequeue();/int data=queue.dequeue();/取出取出 notify();/notify();/通知通知enqueue()enqueue()return data;return data;10-3 Java執行緒的同步-wait()和notify()方法(相關方法)Object類別的相關方法,如下表所示:10-4 管道串流的執行緒Java I/O套件的PipedInputStream和PipedOutputStream管道串流類別是InputStream和OutputStream的子類別,能夠建立類似第10-3節生產者和消費者模型的Java應用程式。PipedInputStream和PipedOutputStream管道串流類別能夠在一個執行緒產生資料寫入PipedOutputStream串流物件,然後在另一個執行緒從PipedInputStream串流物件讀取資料。