摘要:通道參與者參與者保存請求隊列,同時會預創建線程。注啟動線程是一項繁重的工作,模式預先創建一批線程,可以重復使用線程,達到資源再利用提升性能的目的。
一、定義
Work Thread模式和Thread-Per-Message模式類似,Thread-Per-Message每次都創建一個新的線程處理請求,而Work Thread模式預先會創建一個線程池(Thread Pool),每次從線程池中取出線程處理請求。
二、模式案例Request請求類:
public class Request { private final String name; private final int number; private static final Random random = new Random(); public Request(String name, int number) { this.name = name; this.number = number; } public void execute() { System.out.println(Thread.currentThread().getName() + " executes " + this); try { Thread.sleep(random.nextInt(1000)); } catch (InterruptedException e) { } } public String toString() { return "[ Request from " + name + " No." + number + " ]"; } }
Client線程類:
Client線程類用來送出請求:
創建Request實例
將這個實例傳送給Channel類的putRequest方法
public class ClientThread extends Thread { private final Channel channel; private static final Random random = new Random(); public ClientThread(String name, Channel channel) { super(name); this.channel = channel; } public void run() { try { for (int i = 0; true; i++) { Request request = new Request(getName(), i); channel.putRequest(request); Thread.sleep(random.nextInt(1000)); } } catch (InterruptedException e) { } } }
Worker線程類:
WorkerThread類表示工人線程,工人線程可以執行以下動作:
從Channel實例取出Request實例
調用Request實例的execute方法
public class WorkerThread extends Thread { private final Channel channel; public WorkerThread(String name, Channel channel) { super(name); this.channel = channel; } public void run() { while (true) { Request request = channel.takeRequest(); request.execute(); } } }
Channel類:
/** *Channel類可用來接受、傳送工作請求,并保存工人線程。 */ public class Channel { private static final int MAX_REQUEST = 100; // 最大請求數 private final Request[] requestQueue; // 請求隊列 private int tail; private int head; private int count; private final WorkerThread[] threadPool; ? public Channel(int threads) { this.requestQueue = new Request[MAX_REQUEST]; this.head = 0; this.tail = 0; this.count = 0; ? threadPool = new WorkerThread[threads]; for (int i = 0; i < threadPool.length; i++) { threadPool[i] = new WorkerThread("Worker-" + i, this); } } public void startWorkers() { for (int i = 0; i < threadPool.length; i++) { threadPool[i].start(); } } public synchronized void putRequest(Request request) { while (count >= requestQueue.length) { try { wait(); } catch (InterruptedException e) { } } requestQueue[tail] = request; tail = (tail + 1) % requestQueue.length; count++; notifyAll(); } public synchronized Request takeRequest() { while (count <= 0) { try { wait(); } catch (InterruptedException e) { } } Request request = requestQueue[head]; head = (head + 1) % requestQueue.length; count--; notifyAll(); return request; } }
執行:
public class Main { public static void main(String[] args) { Channel channel = new Channel(5); channel.startWorkers(); new ClientThread("Alice", channel).start(); new ClientThread("Bobby", channel).start(); new ClientThread("Chris", channel).start(); } }三、模式講解
Work Thread模式的角色如下:
Client(委托人)參與者
Client參與者會創建請求(Request),然后傳送給Channel參與者。
Channel(通道)參與者
Channel參與者保存Request請求隊列,同時會預創建Worker線程。
Worker(工人)參與者
Worker參與者會從Channel獲取Request。
Request(請求)參與者
Worker參與者會從Channel獲取Request。
注:啟動線程是一項繁重的工作,Worker Thread模式預先創建一批線程,可以重復使用線程,達到資源再利用、提升性能的目的。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/71510.html
摘要:操作完成后,服務會自行停止運行。創建工作隊列,用于將逐一傳遞給實現,這樣您就永遠不必擔心多線程問題。是的消息機制,集中解決線程間通信問題。 2017 Android 面試題 [ 基礎與細節 ] 感謝@chuyao拋出的這些問題,平時業務代碼寫多了,很多基礎的東西變得含糊不清了,這次裸辭出來找工作確實沒有之前順利,順便求上海Android開發的坑。我自己整理了些答案,不對或者不妥的地方請...
摘要:中斷線程當線程的方法方法體執行完畢自然終止或在方法中出現沒有捕獲的異常時意外終止,線程將終止。如果被中斷線程被阻塞,就無法檢測中斷狀態,就會產生異常。 多進程與多線程的本質區別在于:每個進程擁有自己的一整套變量,而線程則共享數據。如果需要執行一個比較耗時的任務,應該使用獨立的線程。 可以通過實現Runnable接口或繼承Thread類來創建獨立的線程。 1) 實現Ruannable接口...
摘要:本人郵箱歡迎轉載轉載請注明網址代碼已經全部托管有需要的同學自行下載引言有一個同步助手可以讓一個或一些線程等待直到另外一些線程執行完一些操作這就是理論在初始化的時候需要一個參數調用的線程會一直等待直到其他線程調用使清空為通常所有等待中的線程會 本人郵箱: 歡迎轉載,轉載請注明網址 http://blog.csdn.net/tianshi_kcogithub: https://github...
閱讀 827·2019-08-30 15:54
閱讀 447·2019-08-30 12:51
閱讀 2028·2019-08-29 16:28
閱讀 2850·2019-08-29 16:10
閱讀 2336·2019-08-29 14:21
閱讀 414·2019-08-29 14:09
閱讀 2138·2019-08-23 16:13
閱讀 1242·2019-08-23 13:59