Java 简单线程池实现
我想了解线程池的逻辑,下面有一个简单的错误且不完整的实现:Java 简单线程池实现,java,concurrency,threadpool,java.util.concurrent,Java,Concurrency,Threadpool,Java.util.concurrent,我想了解线程池的逻辑,下面有一个简单的错误且不完整的实现: class ThreadPool { private BlockingQueue<Runnable> taskQueue; public ThreadPool(int numberOfThreads) { taskQueue = new LinkedBlockingQueue<Runnable>(10); for (int i = 0; i < numbe
class ThreadPool {
private BlockingQueue<Runnable> taskQueue;
public ThreadPool(int numberOfThreads) {
taskQueue = new LinkedBlockingQueue<Runnable>(10);
for (int i = 0; i < numberOfThreads; i++) {
new PoolThread(taskQueue).start();
}
}
public void execute(Runnable task) throws InterruptedException {
taskQueue.put(task);
}
}
class PoolThread extends Thread {
private BlockingQueue<Runnable> taskQueue;
public PoolThread(BlockingQueue<Runnable> queue) {
taskQueue = queue;
}
public void run() {
while (true) {
try {
taskQueue.take().run();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
类线程池{
私有阻塞队列任务队列;
公共线程池(int numberOfThreads){
taskQueue=新的LinkedBlockingQueue(10);
for(int i=0;i
如果要执行的线程数超过taskQueue大小,调用线程会被阻塞吗在这里我们可以看到,在这种情况下,这是一个被拒绝的执行处理程序的工作,但我仍然无法理解它是如何工作的。提前感谢您的帮助
编辑:
将阻塞队列的最大大小设置为10
如果要执行的线程数超过taskQueue大小,调用线程会被阻塞吗
队列的大小是未运行的任务数。通常,即使线程很忙,它也将是空的。拥有一个与线程数匹配的队列长度没有意义,在这一点上也没有什么特别的事情发生
这里我们可以看到,在这种情况下,这是一个被拒绝的执行处理程序的工作
仅当队列已满时才调用拒绝处理程序。您的队列没有限制,因此即使您支持此功能,也不会调用它
但是,如果它确实有限制并且支持此功能,典型的行为是抛出异常。您可以让它执行其他操作,如阻塞、让当前线程运行任务(这是我的首选)或忽略任务
我仍然不明白它是如何工作的
向队列提供()任务时,如果队列无法接受,则返回false。当发生这种情况时,调用被拒绝的执行处理程序。想象一下,一群砌砖工人(你的线程)正在筑墙,一堆砖块(你的阻塞队列) 每个砌砖工人从砖堆中取出一块砖,将其放置好,然后再挑选另一块(taskQueue.take())-直到砖堆中有砖为止,砌砖工人都很忙 一辆卡车时不时地来,用更多的砖块填满砖头——但砖头上的空间有限,如果没有空间,卡车会停下来,等待砖匠使用足够的砖头 只要砖堆中有足够的砖(超过砌砖工人的数量),你可以放心,所有的砌砖工人都有足够的砖来工作——但当砖堆开始变空时,砌砖工人将不得不停止工作,直到新砖交付 你必须挑选适当数量的砌砖工人,数量很少,卡车通常会在堆中等待空间,太多的人,他们中的大多数人会空闲等待新砖 在实现方面,一般来说,Java为您提供了一个线程池,您很少创建自己的线程池-
ExecutorService threadExecutor = Executors.newFixedThreadPool( 3 );
然后你打电话:
threadExecutor.submit(Runnable...);
将任务添加到队列