Upload
winston-hsieh
View
80
Download
2
Embed Size (px)
Citation preview
Thread Pool Mode
Thread pool 模式的概念就是,需要使用執行緒時,在一個執行緒池中尋找可用的執行緒
如果找不到再建立新的,執行緒使用完畢後,留在池中重複使用 若能重複使用所建立的執行緒,而不是用完就丟,可以有效的重
複利用資源
3
Future Mode (1)
考慮這樣一個情況,使用者可能快速翻頁瀏覽文件中,而圖片檔案很大,如此在瀏覽到有圖片的頁數時,就會導致圖片的載入,因而造成使用者瀏覽文件時會有停頓的現象
所以我們希望在文件開啟之後,仍有一個背景作業持續載入圖片,如此使用者在快速瀏覽頁面時,所造成的停頓可以獲得改善。
4
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 (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(); } } }