摘要:通道參與者參與者保存請(qǐng)求隊(duì)列,同時(shí)會(huì)預(yù)創(chuàng)建線程。注啟動(dòng)線程是一項(xiàng)繁重的工作,模式預(yù)先創(chuàng)建一批線程,可以重復(fù)使用線程,達(dá)到資源再利用提升性能的目的。
一、定義
Work Thread模式和Thread-Per-Message模式類似,Thread-Per-Message每次都創(chuàng)建一個(gè)新的線程處理請(qǐng)求,而Work Thread模式預(yù)先會(huì)創(chuàng)建一個(gè)線程池(Thread Pool),每次從線程池中取出線程處理請(qǐng)求。
二、模式案例Request請(qǐng)求類:
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線程類用來(lái)送出請(qǐng)求:
創(chuàng)建Request實(shí)例
將這個(gè)實(shí)例傳送給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類表示工人線程,工人線程可以執(zhí)行以下動(dòng)作:
從Channel實(shí)例取出Request實(shí)例
調(diào)用Request實(shí)例的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類可用來(lái)接受、傳送工作請(qǐng)求,并保存工人線程。 */ public class Channel { private static final int MAX_REQUEST = 100; // 最大請(qǐng)求數(shù) private final Request[] requestQueue; // 請(qǐng)求隊(duì)列 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; } }
執(zhí)行:
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參與者會(huì)創(chuàng)建請(qǐng)求(Request),然后傳送給Channel參與者。
Channel(通道)參與者
Channel參與者保存Request請(qǐng)求隊(duì)列,同時(shí)會(huì)預(yù)創(chuàng)建Worker線程。
Worker(工人)參與者
Worker參與者會(huì)從Channel獲取Request。
Request(請(qǐng)求)參與者
Worker參與者會(huì)從Channel獲取Request。
注:?jiǎn)?dòng)線程是一項(xiàng)繁重的工作,Worker Thread模式預(yù)先創(chuàng)建一批線程,可以重復(fù)使用線程,達(dá)到資源再利用、提升性能的目的。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/71510.html
摘要:操作完成后,服務(wù)會(huì)自行停止運(yùn)行。創(chuàng)建工作隊(duì)列,用于將逐一傳遞給實(shí)現(xiàn),這樣您就永遠(yuǎn)不必?fù)?dān)心多線程問(wèn)題。是的消息機(jī)制,集中解決線程間通信問(wèn)題。 2017 Android 面試題 [ 基礎(chǔ)與細(xì)節(jié) ] 感謝@chuyao拋出的這些問(wèn)題,平時(shí)業(yè)務(wù)代碼寫多了,很多基礎(chǔ)的東西變得含糊不清了,這次裸辭出來(lái)找工作確實(shí)沒(méi)有之前順利,順便求上海Android開發(fā)的坑。我自己整理了些答案,不對(duì)或者不妥的地方請(qǐng)...
摘要:中斷線程當(dāng)線程的方法方法體執(zhí)行完畢自然終止或在方法中出現(xiàn)沒(méi)有捕獲的異常時(shí)意外終止,線程將終止。如果被中斷線程被阻塞,就無(wú)法檢測(cè)中斷狀態(tài),就會(huì)產(chǎn)生異常。 多進(jìn)程與多線程的本質(zhì)區(qū)別在于:每個(gè)進(jìn)程擁有自己的一整套變量,而線程則共享數(shù)據(jù)。如果需要執(zhí)行一個(gè)比較耗時(shí)的任務(wù),應(yīng)該使用獨(dú)立的線程。 可以通過(guò)實(shí)現(xiàn)Runnable接口或繼承Thread類來(lái)創(chuàng)建獨(dú)立的線程。 1) 實(shí)現(xiàn)Ruannable接口...
摘要:本人郵箱歡迎轉(zhuǎn)載轉(zhuǎn)載請(qǐng)注明網(wǎng)址代碼已經(jīng)全部托管有需要的同學(xué)自行下載引言有一個(gè)同步助手可以讓一個(gè)或一些線程等待直到另外一些線程執(zhí)行完一些操作這就是理論在初始化的時(shí)候需要一個(gè)參數(shù)調(diào)用的線程會(huì)一直等待直到其他線程調(diào)用使清空為通常所有等待中的線程會(huì) 本人郵箱: 歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明網(wǎng)址 http://blog.csdn.net/tianshi_kcogithub: https://github...
摘要:關(guān)于,這個(gè)方法只會(huì)喚醒一個(gè)線程,并且不允許指定喚醒哪個(gè)線程,這是可能會(huì)發(fā)生死鎖的。使用不可變對(duì)象降低了垃圾回收所產(chǎn)生的額外開銷,同時(shí)也可以減少一些為了維護(hù)在并發(fā)中的的代碼開銷。 前言 跟著 The Java Tutorials 把并發(fā)的一些基礎(chǔ)過(guò)了一遍,發(fā)現(xiàn)仍然還是有很多不清楚的地方,主要是因?yàn)槠匠](méi)有機(jī)會(huì)實(shí)際應(yīng)用吧,理論知識(shí)要有,實(shí)踐也很重要,哪怕是寫些小 demo 也可以的。 雖然...
閱讀 797·2019-08-30 15:54
閱讀 440·2019-08-30 12:51
閱讀 2022·2019-08-29 16:28
閱讀 2842·2019-08-29 16:10
閱讀 2331·2019-08-29 14:21
閱讀 409·2019-08-29 14:09
閱讀 2127·2019-08-23 16:13
閱讀 1236·2019-08-23 13:59