记录下基于线程池工作原理,简单实现线程池的方式之一
LinkedBlockingDeque
/**
* @Description: 用LinkBlockingDeque和volatile实现线程池
* @author:YIJIAREN225
* @Date:2021-4-30 16:44
*/
public class QueueThreadPool {
// 存储任务队列
private Queue<Runnable> queue = new LinkedBlockingDeque<>();
// 工作线程集合
private List<QueueWorker> workers = new ArrayList<>();
private final int DEFAULT_SIZE = 10;
private int size;
// 线程池执行状态
private volatile boolean RUNNING = true;
/**
* @return
* @Author YIJIAREN225
* @Description 初始化的时候创建指定数量的线程并放入集合中
* @Date 2021-4-30
* @Param
**/
QueueThreadPool() {
this.size = DEFAULT_SIZE;
init();
}
QueueThreadPool(int size) {
this.size = size;
init();
}
private void init() {
for (int i = 0; i < size; i++) {
QueueWorker worker = new QueueWorker("worker_" + i);
worker.start();
workers.add(worker);
}
}
/**
* @return
* @Author YIJIAREN225
* @Description 每次添加任务只放到队列中,等待线程获取
* @Date 2021-4-30
* @Param
**/
public void execute(Runnable runnable) {
if (runnable != null) {
queue.add(runnable);
}
}
public void shutDown() {
RUNNING = false;
workers.clear();
queue.clear();
}
private class QueueWorker extends Thread {
private String name;
QueueWorker(String name) {
this.name = name;
}
/**
* @return
* @Author YIJIAREN225
* @Description 每个工作线程会从队列中获取任务并执行
* @Date 2021-4-30
* @Param
**/
@Override
public void run() {
while (RUNNING) {
Runnable worker = queue.poll();
if (worker != null) {
worker.run();
}
}
}
}
}
新建个线程池执行下任务
public class TestPool {
static AtomicInteger atomicInteger = new AtomicInteger(1);
public static void main(String[] args) throws InterruptedException {
QueueThreadPool pool = new QueueThreadPool(3);
for (int i = 0; i <= 15; i++) {
pool.execute(() -> {
System.out.println(atomicInteger.getAndIncrement() + "号测试任务 started...");
});
}
Thread.sleep(1000);
pool.shutDown();
}
}