本文是简单自定义线程池,只是帮助理解线程池的工作流程,其中很多地方有待完善,不能直接拿到项目里用。
package com.c.study.threadpool;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
/**
* @Author geyuecang
* @Date 2019/10/15 17:36
* @Des
**/
public class ThreadPool {
// 线程池中默认线程数为5
private static int WORK_NUM = 5;
// 队列默认任务上限100
private static int TASK_NUM = 100;
// 工作线程组
private WorkThread[] workThreads;
// 任务队列,作为一个缓冲
private final BlockingQueue<Runnable> taskQueue;
// 用户在构造线程池时希望启动的线程数
private final int worker_num;
// 创建线程池,worker_num为线程池中工作线程的个数
public ThreadPool(int worker_num, int taskCount) {
if (worker_num <= 0) worker_num = WORK_NUM;
if (taskCount <= 0) taskCount = TASK_NUM;
this.worker_num = worker_num;
taskQueue = new ArrayBlockingQueue<>(taskCount);
workThreads = new WorkThread[worker_num];
for (int i = 0; i < worker_num; i++) {
workThreads[i] = new WorkThread();
workThreads[i].start();
}
}
//执行任务,其实是把任务加入到任务队列,什么时候执行由线程池决定
public void execute(Runnable task) {
try {
taskQueue.put(task);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 销毁线程池,该方法保证在所有任务都完成的情况才销毁所有线程,否则等待 任务完成才销毁
public void destroy() {
//工作线程停止工作,切置位null
System.out.println("ready to close pool.....");
for (int i = 0; i < worker_num; i++) {
workThreads[i].stopWorker();
workThreads[i] = null;
}
taskQueue.clear();
}
//工作线程
private class WorkThread extends Thread {
@Override
public void run() {
Runnable r = null;
try {
while (!isInterrupted()) {
r = taskQueue.take();
if (r != null) {
System.out.println(getId() + " ready execut :" + r);
r.run();
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void stopWorker() {
interrupt();
}
}
}