SlideShare a Scribd company logo
Design Pattern
- Multi Thread -
2014/09/12
Winston Hsieh
Outline
 Thread Pool
 Future Mode
 Read-Write-Lock Mode
 Two-phase Termination Mode
2
Thread Pool Mode
 Thread pool 模式的概念就是,需要使用執行緒時,在一個執行
緒池中尋找可用的執行緒
 如果找不到再建立新的,執行緒使用完畢後,留在池中重複使用
 若能重複使用所建立的執行緒,而不是用完就丟,可以有效的重
複利用資源
3
Future Mode (1)
 考慮這樣一個情況,使用者可能快速翻頁瀏覽文件中,而圖片檔
案很大,如此在瀏覽到有圖片的頁數時,就會導致圖片的載入,
因而造成使用者瀏覽文件時會有停頓的現象
 所以我們希望在文件開啟之後,仍有一個背景作業持續載入圖片
,如此使用者在快速瀏覽頁面時,所造成的停頓可以獲得改善。
4
Future Mode
 在請求發生時,會先產生一個Future物件給發出請求的客戶
5
Future Mode
 而同時間,真正的目標物件之生成,由一個 新的執行緒持續進行
(即 Worker Thread),真正的目標物件生成之後,將之設定至
Future之中
6
Future Mode
 而當客戶端真正需要目標物件時, 目標物件也已經準備好,可以
讓客戶提取使用
7
Read-Write-Lock Mode (1)
 被讀取或寫入的資料一個鎖定物件,在讀取或寫入時要向鎖定物
件形式上讀取鎖定,實際上真正是否鎖定共用資源,由鎖定物件
來判斷。
8
public void readData() {
lock.readLock();
doRead();
lock.readUnLock();
}
public void writeData() {
lock.writeLock();
doWrite();
lock.writeUnLock();
}
Read-Write-Lock Mode (2) 9
 讀取者讀取資料時的Sequence Diagram
Read-Write-Lock Mode (3)
 如果可以同時讀取,現在假設有個讀取者已經取得鎖,另一個讀
取者其實也還是可以如下形式上取得鎖定並讀取
10
Read-Write-Lock Mode (4)
 如果現在只剩一個讀取者,而寫入者試圖進行寫入,它也試圖先
取得鎖定,但發現鎖已經被讀取的一方擁有,於是先進入等待,
直到讀取的一方解除鎖定為止。
11
Read-Write-Lock Mode (5)
 writerFirst是寫入優先的旗標,它確保只要有寫入的執行緒在等待
時,在解除鎖定的時候,可以優先由寫入執行緒取得鎖定,以確
保讀取者讀取到 的資料可以是最新的
12
private boolean writerFirst = true; // 寫入優先
public synchronized void readLock() {
try {
while(writingWriters > 0 || (writerFirst && waitingWriters >
0)) {
wait();
}
}
catch(InterruptedException e) {
e.printStackTrace();
}
readingReaders++;
}
public synchronized void readUnLock() {
readingReaders--;
writerFirst = true;
notifyAll();
}
public synchronized void writeLock() {
waitingWriters++
try {
while(readingReaders > 0 || writingWriters > 0) {
wait();
}
}
catch(InterruptedException e) {
e.printStackTrace();
}
finally {
waitingWriters--;
}
writingWriters++;
}
public synchronized void writeUnLock() {
writingWriters--;
writerFirst = false;
notifyAll();
}
Two-phase Termination Mode (1)
 所謂的兩階段終止 (Two-phase termination),即中止「運作階段
」,並完成「善後階段」,完整的完成執行緒的工作
 一個執行緒正在週期性的運作,在「運作階段」您送出了停止執
行緒的請求,這時候執行緒不該慌張的馬上終止目前的工作,而
是先完成這一次週期的工作,然後進入「善後階段」完成一些善
後的工作,例如 關閉檔案或網路串流
13
public class SomeThread extends Thread {
private boolean isTerminated = false;
public void terminate() {
isTerminated = true;
}
public void run() {
while(!isTerminated) {
// ... some statements
}
}
}
Two-phase Termination Mode (2) 14
public class SomeThread extends Thread {
private boolean isTerminated = false;
public void terminate() {
isTerminated = true;
interrupt();
}
public boolean isTerminated() {
return isTerminated;
}
private void doWorkBeforeShutdown() {
// .... do some work before shutdown
}
public void run() {
try {
while(!isTerminated) {
// ... some statements
}
}
catch(InterruptedException e) {
}
finally {
doWorkBeforeShutdown();
}
}
}
Thank You

More Related Content

KEY
Intro-to-SeaJS
PDF
Apache服务之虚拟目录详解.pdf
PPTX
Rethink db&tokudb调研测试报告
PPTX
Rethinkdb and tokudb research
PPTX
Rethink db&tokudb调研测试报告
PDF
MIS MySQL 入門
DOC
存储过程入门与提高
PPTX
Cjcu im-prj-103-11
Intro-to-SeaJS
Apache服务之虚拟目录详解.pdf
Rethink db&tokudb调研测试报告
Rethinkdb and tokudb research
Rethink db&tokudb调研测试报告
MIS MySQL 入門
存储过程入门与提高
Cjcu im-prj-103-11
Ad

Design Pattern - Multi Thread

  • 1. Design Pattern - Multi Thread - 2014/09/12 Winston Hsieh
  • 2. Outline  Thread Pool  Future Mode  Read-Write-Lock Mode  Two-phase Termination Mode 2
  • 3. Thread Pool Mode  Thread pool 模式的概念就是,需要使用執行緒時,在一個執行 緒池中尋找可用的執行緒  如果找不到再建立新的,執行緒使用完畢後,留在池中重複使用  若能重複使用所建立的執行緒,而不是用完就丟,可以有效的重 複利用資源 3
  • 4. Future Mode (1)  考慮這樣一個情況,使用者可能快速翻頁瀏覽文件中,而圖片檔 案很大,如此在瀏覽到有圖片的頁數時,就會導致圖片的載入, 因而造成使用者瀏覽文件時會有停頓的現象  所以我們希望在文件開啟之後,仍有一個背景作業持續載入圖片 ,如此使用者在快速瀏覽頁面時,所造成的停頓可以獲得改善。 4
  • 6. Future Mode  而同時間,真正的目標物件之生成,由一個 新的執行緒持續進行 (即 Worker Thread),真正的目標物件生成之後,將之設定至 Future之中 6
  • 7. Future Mode  而當客戶端真正需要目標物件時, 目標物件也已經準備好,可以 讓客戶提取使用 7
  • 8. Read-Write-Lock Mode (1)  被讀取或寫入的資料一個鎖定物件,在讀取或寫入時要向鎖定物 件形式上讀取鎖定,實際上真正是否鎖定共用資源,由鎖定物件 來判斷。 8 public void readData() { lock.readLock(); doRead(); lock.readUnLock(); } public void writeData() { lock.writeLock(); doWrite(); lock.writeUnLock(); }
  • 9. Read-Write-Lock Mode (2) 9  讀取者讀取資料時的Sequence Diagram
  • 10. Read-Write-Lock Mode (3)  如果可以同時讀取,現在假設有個讀取者已經取得鎖,另一個讀 取者其實也還是可以如下形式上取得鎖定並讀取 10
  • 11. Read-Write-Lock Mode (4)  如果現在只剩一個讀取者,而寫入者試圖進行寫入,它也試圖先 取得鎖定,但發現鎖已經被讀取的一方擁有,於是先進入等待, 直到讀取的一方解除鎖定為止。 11
  • 12. Read-Write-Lock Mode (5)  writerFirst是寫入優先的旗標,它確保只要有寫入的執行緒在等待 時,在解除鎖定的時候,可以優先由寫入執行緒取得鎖定,以確 保讀取者讀取到 的資料可以是最新的 12 private boolean writerFirst = true; // 寫入優先 public synchronized void readLock() { try { while(writingWriters > 0 || (writerFirst && waitingWriters > 0)) { wait(); } } catch(InterruptedException e) { e.printStackTrace(); } readingReaders++; } public synchronized void readUnLock() { readingReaders--; writerFirst = true; notifyAll(); } public synchronized void writeLock() { waitingWriters++ try { while(readingReaders > 0 || writingWriters > 0) { wait(); } } catch(InterruptedException e) { e.printStackTrace(); } finally { waitingWriters--; } writingWriters++; } public synchronized void writeUnLock() { writingWriters--; writerFirst = false; notifyAll(); }
  • 13. Two-phase Termination Mode (1)  所謂的兩階段終止 (Two-phase termination),即中止「運作階段 」,並完成「善後階段」,完整的完成執行緒的工作  一個執行緒正在週期性的運作,在「運作階段」您送出了停止執 行緒的請求,這時候執行緒不該慌張的馬上終止目前的工作,而 是先完成這一次週期的工作,然後進入「善後階段」完成一些善 後的工作,例如 關閉檔案或網路串流 13 public class SomeThread extends Thread { private boolean isTerminated = false; public void terminate() { isTerminated = true; } public void run() { while(!isTerminated) { // ... some statements } } }
  • 14. Two-phase Termination Mode (2) 14 public class SomeThread extends Thread { private boolean isTerminated = false; public void terminate() { isTerminated = true; interrupt(); } public boolean isTerminated() { return isTerminated; } private void doWorkBeforeShutdown() { // .... do some work before shutdown } public void run() { try { while(!isTerminated) { // ... some statements } } catch(InterruptedException e) { } finally { doWorkBeforeShutdown(); } } }

Editor's Notes