前言
正文
介绍
可以当做 Worker Thread 模式的改进版,一个任务一个线程,但是当任务结束后,并不销毁线程,而是等待下一个任务
优点&缺点
优点:线程复用,避免重复创建线程造成的资源消耗
缺点:不灵活,不会随着任务数的增加而增加线程数量,也不会随着任务数量的减少而减少线程数量
实现
对Thread-Per-Message进行改进,用阻塞队列保存任务,当有任务时,线程领取任务进行执行,当没有任务时,线程等待
public class WorkerThreadTest {
private final BlockingQueue<Runnable> works;
public WorkerThreadTest(BlockingQueue _works,int _threadNum){
this.works = _works;
for (int i = 0; i < _threadNum; i++) {
new Thread(()->{
//使线程一直运行,阻止线程销毁
while(true){
synchronized(this){
if(!works.isEmpty()){
works.poll().run();
}
}
}
}).start();
}
}
public void execute(Runnable work){
if(null == work){
throw new NullPointerException("任务不可以为 null");
}
works.add(work);
}
}
public class Client {
public static void main(String[] args) {
//设置任务阻塞队列
LinkedBlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<>(8);
//设置线程数为 6
WorkerThreadTest wt = new WorkerThreadTest(workQueue,6);
wt.execute(new Runnable() {
@Override
public void run() {
System.out.println("hello world");
}
});
}
}