前言
正文
介绍
可以当做 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);//设置线程数为 6WorkerThreadTest wt = new WorkerThreadTest(workQueue,6);wt.execute(new Runnable() {@Overridepublic void run() {System.out.println("hello world");}});}}
