1 / 15

Thread 簡介 -- 什麼是執行緒

依序執行. 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)

azriel
Download Presentation

Thread 簡介 -- 什麼是執行緒

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 依序執行 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

  2. 程式,行程,執行緒 • 程式 (Program) • 儲存於硬碟中的可執行檔稱為 Program • 行程 (Process) • 載入記憶體中的可執行檔稱為 Process • 執行緒 (Thread) • Process 中的一段程式碼執行軌跡稱為 Thread,是電腦中最小的執行單位。 Program Process Thread HDD Memory

  3. 多工與多執行緒 • 目前的作業系統都強調多工(Multitasking) 。 • 例如:在Windows上可以同時執行小畫家、記事本與IE瀏覽器等多個應用程式。 • 多執行緒(Multithreaded)是指在單一應用程式擁有多個執行流程。 • 例如:IE瀏覽器可以在下載網頁檔案的同時顯示動畫、撥放音樂或捲動視窗瀏覽網頁內容。

  4. 建立一個執行緒的方法 • 要建立一個 Thread,先要建造一個 Thread 物件,再用 new 產生 Thread 的個體。您 new 幾次,就有幾個 Thread。 • 建造一個 Thread 物件的方法: • 直接繼承 Thread 類別 • 實作 Runnable 介面 • 二種方法皆可實作出多執行緒的程式,就看程式開發人員如何抉擇與使用。通常來說,利用Thread類別撰寫比較容易,用Runnable則可以忽略Java中單一繼承的限制 • 利用Runnable介面來撰寫執行緒,程式較有一致性,當其他程式要用到時,可以有共同介面的標準,也比較符合物件導向(OO)的精神。

  5. Thread 物件簡介 • 繼承Thread類別: • 使用時機:若類別沒有繼承其他類別,就可以直接繼承Thread類別,然後覆寫run()方法。 • 在主類別程式中再建立執行緒物件,然後以start()方法啟動個別的執行緒。 • 範例程式: http://mail.tajen.edu.tw/~reler/object/TestThread.java

  6. 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(); } }

  7. Thread 物件簡介 • 父類別Thread的建構子參數介紹: • Thread() • Thread(String name) • Thread(Runnable target) • Thread(Runnable target, String name) • 建立Thread物件,參數name是執行緒名稱,target是實作Runnable介面的物件(使用繼承Thread時用不到target參數)。

  8. 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 馬上去死。

  9. 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: 預設優先順序值。

  10. Runnable 介面簡介 • 用途 • 自訂 Thread 時,除了繼承 Thread類別,也可實作 Runnable 介面。 • 使用時機 • 當您自訂的類別已經繼承其它類別,卻又要變成一個 Thread 物件時。 • 例如,Swing應用程式繼承自JFrame,Java Applet繼承自JApplet。 • 介面提供的方法: • void run()Runnable 內唯一需要程式師實作的方法。

  11. 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();} }

  12. 王先生 王太太 $10000 $10000 - $1000 - $9000 $9000 $1000 提領 $1000 提領 $9000 執行緒同步問題 • 所謂 “執行緒同步問題” 是指兩個執行緒同時存取一個共用變數時,所會發生的問題: $10000 $1000 $9000 提領 $1000

  13. 王先生 王太太 $10000 $10000 執行緒同步問題 $10000 問題就出在這裡

  14. 王先生 王太太 - $1000 執行緒同步問題 • 解決方法:Lock – Wait - Notify $10000 Lock Wait $10000 $9000 Notify $9000 $9000

  15. 執行緒同步問題 • 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

More Related