gpt4 book ai didi

java - newFixedThreadPool 的内部工作

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:43:26 26 4
gpt4 key购买 nike

请帮助我理解 newFixedThreadPool(或缓存)的内部流程

当我们写下面的语句时,ExecutorService e=Executors.newFixedThreadPool(3);

  1. e.execute(runaable1);
  2. e.execute(runaable2);
  3. e.execute(runaable3);
  4. e.execute(runaable4);
  5. e.execute(runaable5);

直到第3个execute方法,会创建3个线程,当调用第4个execute方法时,不会创建新线程,工作会等待一个线程空闲。

我不明白这一点“不会创建新线程,但工作将等待线程空闲”。我认为当runnable1将被赋予第一个创建的线程时,一旦runnable1的run方法完成,Thread1的run也将完成,thread1将无法调用runnable4的run方法。那么,java 如何设法仅用 3 个线程执行 5 个 Runnable。

最佳答案

仅供引用:这是一个非常简单的线程池实现。

class MyThreadPool implements java.util.concurrent.Executor 
{
private final java.util.concurrent.BlockingQueue<Runnable> queue;

public MyThreadPool(int numThreads) {
queue = new java.util.concurrent.LinkedBlockingQueue<>();
for (int i=0 ; i<numThreads ; i++) {
new Thread(new Runnable(){
@Override
public void run() {
while(true) {
queue.take().run();
}
}
}).start();
}
}

@Override
public void execute(Runnable command) {
queue.put(command);
}
}

这不会编译,因为我没有处理 InterruptedException,并且在 真实 线程池中,您还需要处理给定 命令可能抛出的异常,但它应该让您大致了解线程池的作用。

它创建一个队列和任意数量的工作线程。工作线程相互竞争以使用队列中的命令。该队列是一个 BlockingQueue,因此只要队列为空,所有工作人员都会 hibernate 。

其他线程可能会产生新命令(即Runnable对象),并调用execute(command)方法将新命令放入队列。命令将由工作线程执行(即,将调用它们的运行方法),其顺序与它们入队的顺序大致*相同。


  • 大约是因为 worker A 可以从队列中选择一个新命令,然后在调用该命令的 .run() 方法之前失去它的时间片。然后其他工作人员可以从队列中选择其他命令并在调度程序允许工作人员 A 再次运行之前执行它们。

关于java - newFixedThreadPool 的内部工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31123457/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com