【发布时间】:2019-09-14 12:06:38
【问题描述】:
出于学习目的,我试图在 java 中实现我自己的线程池。以下是我已经实施的。我对这个实现有几个问题:
虽然我正在使用 BlockingQueue,比如内置的 java Executors 希望我们提供 Runnable 对象(通过 execute 方法)。但就我而言,我觉得我可以创建任何对象而不是 Runnable。那么为什么 Java 执行器期望 Runnable,我尝试查看源代码但仍然无法弄清楚。
这个原始实现还有什么问题吗?
请找到代码。
公共类 CustomThreadPool {
private final BlockingQueue<Runnable> blockingQueue;
private final Worker[] workers;
public CustomThreadPool(final int numOfThreads) {
blockingQueue = new LinkedBlockingQueue<>();
workers = new Worker[numOfThreads];
for (int i = 0; i < numOfThreads; i++) {
workers[i] = new Worker();
workers[i].start();
}
}
public void execute(final Runnable task) {
blockingQueue.add(task);
}
public void shutdownImmediately() {
for (int i = 0; i < workers.length; i++) {
workers[i].shutdownSignal = true;
workers[i] = null;
}
}
private class Worker extends Thread {
private Runnable taskToPerform = null;
boolean shutdownSignal = false;
@Override
public void run() {
while(true && !shutdownSignal) {
taskToPerform = blockingQueue.poll();
if (taskToPerform != null) {
taskToPerform.run();
}
if(shutdownSignal) {
break;
}
}
}
}
public static void main(String[] args) throws Exception {
final CustomThreadPool threadPool = new CustomThreadPool(5);
for (int i = 0; i < 20; i++) {
threadPool.execute(() -> System.out.println(Thread.currentThread().getName()));
}
Thread.sleep(1*1000);
threadPool.shutdownImmediately();
}
}
【问题讨论】:
标签: java multithreading synchronization threadpool