Transcript Thread

Thread
 Program
 Process
– CPU
– Code
– Data
Runnable
類別
 Thread
– Lightweight process
Code Data
CPU
Thread 物件
Runnable
物件
建立Thread
 java.lang.Thread
 二種建立Thread的方法
– 繼承 java.lang.Thread 類別
– 實作 java.lang.Runnable 介面
繼承 java.lang.Thread 類別
– 寫一個新類別,繼承java.lang.Thread類別
– 覆寫 public void run() 方法
– 產生thread物件:
• New 一個新類別物件
• New 一個Thread物件,以新類別物件做參數
– 執行start()方法
實作 java.lang.Runnable 介面
– 覆寫 public void run() 方法
– 產生一個thread物件
• New 一個Thread物件,以新類別物件做參數
– 執行start()方法
Threads vs. Runnable
 Implementing Runnable :
– 較符合物件導向精神與架構
– Java類別只能單一繼承,卻可實作多個介面
– 程式的一致性
 Extending Thread :
– 程式碼較簡單
Threads操作
Blocked
Pool
new
dead
Unblocked
event
Blocking
event
start()
Runnable
Lock
released
Lock
Pool
Scheduler
run()
completed
Running
synchronized
wait()
interrupt()
notify()
Wait
pool
Threads操作
 啟動Thread
public void start()
 停止Thread
– 寫一個新類別,實做java.lang.Thread介面
– public final void stop() – Deprecated
– 執行完run()
new
start()
Runnable
Scheduler
Running
dead
run()
completed
Threads操作
 暫停Thread
– sleep方法 : 暫時停止thread物件的執行一段
時間,時間到了進入可執行狀態等待繼續執行
public static void sleep(long millis) throws
InterruptedException
public static void sleep(long millis, int nanos)
throws InterruptedException
Threads操作
– yield方法:停止執行,轉移到等待狀態,將CPU
的使用權讓出來
public static void yield()
– join方法:某個thread等待另一個thread執行完
後才能夠被執行
public final void join() throws
InterruptedException
public final void join(long millis) throws
InterruptedException
sleep() timeout
join() thread end
interrupt()
new
Blocked
Pool
sleep()
join()
dead
Unblocked
event
Blocking
event
start()
Runnable
Scheduler
yield()
run()
completed
Running
取得Thread資訊
 取得Thread資訊
– public final boolean isAlive()
– public final void setName(String name)
– public final String getName()
– public static Thread currentThread()
– public final void setPriority(int newPriority)
– public final int getPriority()
資料同步處理
 共用程式碼,不共用資料
 共用程式碼,共用資料
 有些程式不可以被分割執行
同步機制
 每一個物件都有一個鎖("lock flag“)
 Synchronized 表示要執行該段程式碼時,
必須先取得某個物件的鎖
Scheduler
new
start()
Runnable
Running
Lock
released
synchronized
Lock
Pool
run()
completed
dead
Synchronized 語法
 Synchronized block
synchronized (要取得lock的物件) {
//需鎖定的程式碼
}
 Synchronized method
public synchronized void methodName(){
//需鎖定的方法內容
}
Synchronized block vs. method
鎖定範圍
可鎖定物件
文件顯示同步
Synchronized
block
Block
Synchronized
method
Method
本身及
其他物件
不能
本身物件
(this)
能
死結 Death Lock
 Death Lock
– 兩個或多個threads,各自在等待對方擁有的
鎖
 Java本身不提供death lock的偵測,避免及
處理機制
 程式時可用下列原則來預防Death Lock :
– 決定lock取得的優先順序
– 所有程式嚴格遵守lock的取的順序
– 釋放lock時,依相反順序釋放
Thread進階操作
 Thread interaction
– Thread之間,等待某個特定的事件發生,再去
作接下來的事
– Ex: Producer and Consumer 機制
Thread interaction
 wait and notify (Java.lang.Object)
public final void wait() throws
InterruptedException
public final void wait(long timeout) throws
InterruptedException
public final void notify()
public final void notifyAll()
Monitor Model
 The pools:
– Wait pool
– Lock pool
Scheduler
new
start()
Runnable
Lock
released
Lock
Pool
Running
synchronized
wait()
interrupt()
notify()
Wait
pool
run()
completed
dead
Monitor Model
 優點
– 保證共用資料會在一致的狀況
– 保證系統不會產生deadlock
 注意
– wait()和notify()必須在鎖定的程式碼中才可
呼叫,否則會產生
IllegalMonoitorStateException
Deprecated Method
 JDK1.1後,因安全性考量,不再使用
– suspend()
– resume()
– stop()
 可用Monitor Model來達成這三個功能