210 likes | 646 Views
依序執行. Thread 簡介 -- 什麼是執行緒. 定義: 程式的執行軌跡. Multi-Thread. Single Thread. int x, y; int z; x = 3; y = x + 4; z = 5;. int x, y; x = 3; y = x + 4;. int z; z = 5;. CPU. CPU. 程式,行程,執行緒. 程式 (Program) 儲存於硬碟中的可執行檔稱為 Program 行程 (Process) 載入記憶體中的可執行檔稱為 Process 執行緒 (Thread)
E N D
依序執行 Thread 簡介--什麼是執行緒 • 定義: • 程式的執行軌跡 Multi-Thread Single Thread int x, y; int z; x = 3; y = x + 4; z = 5; int x, y; x = 3; y = x + 4; int z; z = 5; CPU CPU
程式,行程,執行緒 • 程式 (Program) • 儲存於硬碟中的可執行檔稱為 Program • 行程 (Process) • 載入記憶體中的可執行檔稱為 Process • 執行緒 (Thread) • Process 中的一段程式碼執行軌跡稱為 Thread,是電腦中最小的執行單位。 Program Process Thread HDD Memory
多工與多執行緒 • 目前的作業系統都強調多工(Multitasking) 。 • 例如:在Windows上可以同時執行小畫家、記事本與IE瀏覽器等多個應用程式。 • 多執行緒(Multithreaded)是指在單一應用程式擁有多個執行流程。 • 例如:IE瀏覽器可以在下載網頁檔案的同時顯示動畫、撥放音樂或捲動視窗瀏覽網頁內容。
建立一個執行緒的方法 • 要建立一個 Thread,先要建造一個 Thread 物件,再用 new 產生 Thread 的個體。您 new 幾次,就有幾個 Thread。 • 建造一個 Thread 物件的方法: • 直接繼承 Thread 類別 • 實作 Runnable 介面 • 二種方法皆可實作出多執行緒的程式,就看程式開發人員如何抉擇與使用。通常來說,利用Thread類別撰寫比較容易,用Runnable則可以忽略Java中單一繼承的限制 • 利用Runnable介面來撰寫執行緒,程式較有一致性,當其他程式要用到時,可以有共同介面的標準,也比較符合物件導向(OO)的精神。
Thread 物件簡介 • 繼承Thread類別: • 使用時機:若類別沒有繼承其他類別,就可以直接繼承Thread類別,然後覆寫run()方法。 • 在主類別程式中再建立執行緒物件,然後以start()方法啟動個別的執行緒。 • 範例程式: http://mail.tajen.edu.tw/~reler/object/TestThread.java
Thread 物件簡介 • 使用方法: class MyThread extends Thread { //呼叫父類別Thread的Thread(String name)建構子 public MyThread(String n) //設定執行緒名稱 { super(n); } public void run() //Thread執行的程式片段 {…….. } } Class MainClass{ public static void main(String[] args) { //主類別程式 //建立執行緒 MyThread t1 = new MyThread("t1"); MyThread t2 = new MyThread("t2"); //啟動執行緒 t1.start(); t2.start(); } }
Thread 物件簡介 • 父類別Thread的建構子參數介紹: • Thread() • Thread(String name) • Thread(Runnable target) • Thread(Runnable target, String name) • 建立Thread物件,參數name是執行緒名稱,target是實作Runnable介面的物件(使用繼承Thread時用不到target參數)。
Thread 物件簡介 • 與 “行為” 有關的方法: • void run(): 定義此執行緒的任務。一旦執行緒醒過來後,run() 裡面定義什麼,它就執行什麼。執行完 run() 後就會死。 • void start(): 開始執行 Thread。此方法會觸動 run() 函數 • boolean isAlive(): 傳回此 Thread 是否活動中。 • static void yield(): 把自己暫停,先禮讓其它相同優先順序的 Thread 執行。 • static void sleep(long millis): 讓自己小睡片刻,經過 millis 微秒 (ms) 後再醒過來 • void join(): 停止執行,等死。 • void destroy(): 命令 Thread 馬上去死。
Thread 物件簡介 • 與 “屬性” 有關的方法: • void setName(String name): 為此執行緒取個名字 • String getName(): 傳回此執行緒的名字 • void setPriority(int newPriority): 設定此執行緒的優先順序。數字越大,優先順序越高。 • int getPriority(): 傳回此執行緒的優先順序。 • String toString(): 傳回此執行緒的名稱,優先順序,及所屬群組。 • Thread 物件內的常數 • static int MAX_PRIORITY: 最高優先順序值。 • static int MIN_PRIORITY: 最低優先順序值。 • static int NORM_PRIORITY: 預設優先順序值。
Runnable 介面簡介 • 用途 • 自訂 Thread 時,除了繼承 Thread類別,也可實作 Runnable 介面。 • 使用時機 • 當您自訂的類別已經繼承其它類別,卻又要變成一個 Thread 物件時。 • 例如,Swing應用程式繼承自JFrame,Java Applet繼承自JApplet。 • 介面提供的方法: • void run()Runnable 內唯一需要程式師實作的方法。
Runnable 介面簡介 • 使用方法:範例程式:http://mail.tajen.edu.tw/~reler/object/TestThread2.java class MyThread extends ParentClassimplements Runnable {public void run() //Thread執行的程式片段 {…………..} } public class TestThread {public static void main(String args[]) {MyThread r = new MyThread ();//建立Thread物件,並指定r為Thread真正執行的部份(也就是Runnable) Thread t1 = new Thread(r,”T1”);//”T1”設為Thread的名稱Thread t2 = new Thread(r,”T2”);//”T2”設為Thread的名稱 //啟動執行緒 t1.start();t2.start();} }
王先生 王太太 $10000 $10000 - $1000 - $9000 $9000 $1000 提領 $1000 提領 $9000 執行緒同步問題 • 所謂 “執行緒同步問題” 是指兩個執行緒同時存取一個共用變數時,所會發生的問題: $10000 $1000 $9000 提領 $1000
王先生 王太太 $10000 $10000 執行緒同步問題 $10000 問題就出在這裡
王先生 王太太 - $1000 執行緒同步問題 • 解決方法:Lock – Wait - Notify $10000 Lock Wait $10000 $9000 Notify $9000 $9000
執行緒同步問題 • Java 的解決方法: • Lock: 使用 synchronized 保留字 • Wait: 使用 Wait() 函數 • Notify: 使用 Notify() 或 NotifyAll() • 範例1:未經過同步保護的例子 • http://mail.tajen.edu.tw/~reler/object/ThreadS1.java • 範例2:經過同步保護的例子 • http://mail.tajen.edu.tw/~reler/object/ThreadS2.java • 範例3:另一種同步保護的寫法 • http://mail.tajen.edu.tw/~reler/object/ThreadS3.java