java执行器服务

java执行器服务,java,executorservice,threadpoolexecutor,Java,Executorservice,Threadpoolexecutor,当我用下面的JAVA代码创建ExecutorService时,有人能解释一下ExecutorService是如何工作的吗 ExecutorService executor = Executors.newFixedThreadPool(400); for (int i = 0; i < 500; i++) { Runnable worker = new MyRunnable(10000000L + i); executor.execute(worke

当我用下面的JAVA代码创建
ExecutorService
时,有人能解释一下
ExecutorService
是如何工作的吗

ExecutorService executor = Executors.newFixedThreadPool(400);

    for (int i = 0; i < 500; i++) {
        Runnable worker = new MyRunnable(10000000L + i);
        executor.execute(worker);
    }
ExecutorService executor=Executors.newFixedThreadPool(400);
对于(int i=0;i<500;i++){
Runnable worker=新的MyRunnable(10000000L+i);
执行人,执行人(工人);
}
我相信将有一个工作队列,我的for循环将向该队列添加500个
Runnable
任务。现在已创建了包含400个线程的
ExecutorService

因此,在队列中的500个任务中,
ExecutorService
中的400个线程将一次执行这400个任务,而剩余的as插槽将被释放

我的理解正确吗?

创建一个线程池,该线程池重用固定数量的操作线程 离开共享的无界队列。在任何时候,最多读取个线程 将是活动的处理任务如果提交了其他任务 当所有线程都处于活动状态时,它们将在队列中等待,直到 线程可用。如果任何线程在运行期间由于故障而终止 在关闭前执行,如果需要,将替换一个新的 执行后续任务。池中的线程将一直存在到 它是显式关闭的


如果任务超过了处理线程的数量,则线程尚未拾取的任务将等待。一旦线程完成一个任务,它将再接收一个等待的任务

但是这些线程池(除了
ForkJoinPool
)在窃取工作线程任务方面效率不高

假设一个线程是10个待执行任务的积压工作,它运行的是第一个任务。同时,池中的其他线程处于空闲状态。在这种情况下,一旦为任务分配了一个线程,即使其他线程处于空闲状态,也只有该线程将执行该任务

与其他类型的ExecutorService不同,主要是由于采用了工作窃取:池中的所有线程都试图查找并执行提交到池和/或由其他活动任务创建的任务(如果不存在,则最终阻止等待工作)

Java8中又添加了一个新的API

public static ExecutorService newWorkStealingPool()
使用所有可用的处理器作为其目标并行级别创建工作线程池


相关问题:

您肯定不想要400个线程。