日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java workthread_Java多线程基础(十)——Work Thread模式

發(fā)布時間:2025/3/15 java 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java workthread_Java多线程基础(十)——Work Thread模式 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、定義

Work Thread模式和Thread-Per-Message模式類似,Thread-Per-Message每次都創(chuàng)建一個新的線程處理請求,而Work Thread模式預先會創(chuàng)建一個線程池(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線程類用來送出請求:

創(chuàng)建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類表示工人線程,工人線程可以執(zhí)行以下動作:

從Channel實例取出Request實例

調(diào)用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; // 最大請求數(shù)

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;

}

}

執(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參與者會創(chuàng)建請求(Request),然后傳送給Channel參與者。

Channel(通道)參與者

Channel參與者保存Request請求隊列,同時會預創(chuàng)建Worker線程。

Worker(工人)參與者

Worker參與者會從Channel獲取Request。

Request(請求)參與者

Worker參與者會從Channel獲取Request。

注:啟動線程是一項繁重的工作,Worker Thread模式預先創(chuàng)建一批線程,可以重復使用線程,達到資源再利用、提升性能的目的。

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結

以上是生活随笔為你收集整理的java workthread_Java多线程基础(十)——Work Thread模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。