本文章欢迎转载,但是转载请标明出处。程序锋子https://blog.csdn.net/l13591302862/article/details/113741734
前言
线程池大家都用过,但是线程池的内部源码,大家可能不太了解。没了解过源码的小伙伴可以通过该文章了解,了解过的也可以先思考下了解到什么程度,然后再和本文进行对比,可能会有新的理解。
手写简易线程池
为了更好地理解线程池,手写了一个简单的线程池。同样使用阻塞队列,线程数量是固定的,线程池创建时就创建和运行所有线程。虽然和 ThreadPoolExecutor
相比差很低,但是也达到复用线程的目的,核心思想不变,都是生产者消费者模型。
public class MyThreadPool implements Executor {
/**
* Worker 列表
*/
private List<Worker> workers;
/**
* 任务阻塞队列
*/
private final BlockingQueue<Runnable> tasks = new LinkedBlockingQueue<>();
private final static int NCPU = Runtime.getRuntime().availableProcessors();
/**
* 核心线程数量
*/
private final int coreSize;
/**
* 线程工厂
*/
private final ThreadFactory threadFactory;
/**
* 终止标志
*/
private volatile boolean terminated;
private static final ThreadFactory DEFAULT_THREAD_FACTORY = new ThreadFactory() {
private final AtomicInteger counter = new AtomicInteger();
@Override
public Thread newThread(Runnable r) {
return new Thread(r, "default-pool-" + counter.getAndIncrement());
}
};
public MyThreadPool() {
this(NCPU, DEFAULT_THREAD_FACTORY);
}
public MyThreadPool(int coreSize, ThreadFactory threadFactory) {
checkParameter(coreSize, threadFactory);
this.coreSize = coreSize;
this.threadFactory = threadFactory;
init();
}
private void checkParameter(int coreSize, ThreadFactory threadFactory) {
if (coreSize <= 0) {
throw new IllegalArgumentException("coreSize must more than zero");
}
if (threadFactory == null) {
throw new NullPointerException("threadFactory cant be none");
}
}
private void init() {
workers = new ArrayList<>(coreSize);
for (int i = 0; i < coreSize; i++) {
workers.add(new Worker());
}
}
public void stop() {
terminated = true;
invokerAllThreadInterrupt();
}
private void invokerAllThreadInterrupt() {
for (Worker worker : workers) {
worker.thread.interrupt();
}
}
@Override
public void execute(Runnable command) {
try {
tasks.put(command);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private