轻松学习多线程 12-Worker Thread 有活就干模式
2019年1月19日大约 2 分钟
Worker Thread 模式
Worker Thread 模式就是没有工作就一直等待,工作来了就进行处理。
实际案例
类信息概览:
类名 | 说明 |
---|---|
Main.java | 方法的总入口 |
ClientThread.java | 客户端线程 |
Channel.java | 通道 |
WorkerThread.java | 工人线程 |
Request.java | 请求 |
定义
- ClientThread.java
package com.github.houbb.thread.learn.easy.learn.workerThread;
import com.github.houbb.thread.learn.easy.learn.ThreadUtil;
import com.github.houbb.thread.learn.easy.learn.id.IdGen;
import com.github.houbb.thread.learn.easy.learn.id.IncreaseIdGen;
/**
* 2018/2/3
*
* @author houbinbin
* @version 1.0
* @since 1.7
*/
public class ClientThread extends Thread {
private final Channel channel;
public ClientThread(String name, Channel channel) {
super(name);
this.channel = channel;
}
@Override
public void run() {
IdGen idGen = new IncreaseIdGen();
while(true) {
Request request = new Request(getName(), idGen.genId());
try {
channel.putRequest(request);
ThreadUtil.sleepRandom();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
- Channel.java
package com.github.houbb.thread.learn.easy.learn.workerThread;
/**
* 2018/2/3
*
* @author houbinbin
* @version 1.0
* @since 1.7
*/
public class Channel {
/**
* 最大存储数量
*/
private static final int MAX_SIZE = 100;
/**
* 存储 request 的位置
*/
private int tail = 0;
/**
* 取出 request 的位置
*/
private int head = 0;
/**
* request 的数量
*/
private int count = 0;
private Request[] requestQueue = new Request[MAX_SIZE];
/**
* 线程池
*/
private WorkerThread[] threadsPool;
public Channel(int threads) {
threadsPool = new WorkerThread[threads];
for(int i = 0; i = requestQueue.length) {
wait();
}
requestQueue[tail] = request;
count++;
tail = (tail+1) % requestQueue.length; //移动位置
System.out.println("put...");
notifyAll();
}
public synchronized Request takeRequest() throws InterruptedException {
while (count [Worker Thread](https://github.com/houbb/thread-learn/tree/master/easy-learn/src/main/java/com/github/houbb/thread/learn/easy/learn//Users/houbinbin/IT/OTHER/thread-learn/easy-learn/src/main/java/com/github/houbb/thread/learn/easy/learn/workerThread)
# 系列导航
> [多线程系列导航](http://blog.csdn.net/ryo1060732496/article/details/79376415)
贡献者
binbin.hou