Java Executors.newFixedThreadPool中LinkedBlockingQueue的好处

Java Executors.newFixedThreadPool中LinkedBlockingQueue的好处,java,threadpoolexecutor,Java,Threadpoolexecutor,我无法找出为什么JDK在Executors.newFixedThreadPool中使用LinkedBlockingQueue而不是ArrayBlockingQueue的好处 return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new Linked

我无法找出为什么JDK在Executors.newFixedThreadPool中使用LinkedBlockingQueue而不是ArrayBlockingQueue的好处

return new ThreadPoolExecutor(nThreads, nThreads,
                                      0L, TimeUnit.MILLISECONDS,
                                      new LinkedBlockingQueue<Runnable>());
返回新的ThreadPoolExecutor(nThreads,nThreads,
0L,时间单位为毫秒,
新建LinkedBlockingQueue());
ArrayBlockingQueue的好处是它的速度很快,但是集合应该在开始时进行绑定和定义,这在newFixedThreadPool中都适用

return new ThreadPoolExecutor(nThreads, nThreads,
                                      0L, TimeUnit.MILLISECONDS,
                                      new LinkedBlockingQueue<Runnable>());

因此,需要一些好处或额外的功能,这是ArrayBlockingQueue无法实现的

fixedThreadPool并不意味着内部队列是有界的,而是只能创建最大数量的线程。从Oracle文档中:
任务通过内部队列提交到池中,当活动任务多于线程时,该队列会保存额外的任务。
(请参阅)


由此得出的结论是,如果队列是无界的,则LinkedBlockingQueue更具相关性,因为ArrayBlockingQueue是有界的,并且其大小不能更改。

fixedThreadPool并不意味着内部队列是有界的,而是只能创建最大数量的线程。从Oracle文档中:
任务通过内部队列提交到池中,当活动任务多于线程时,该队列会保存额外的任务。
(请参阅)


由此得出结论,如果队列是无界的,那么LinkedBlockingQueue更相关,因为ArrayBlockingQueue是有界的,其大小不能更改。

在FixedThreadPool中,队列的初始数量(第一个参数)与线程的最大数量(第二个参数)完全相同,我们给出了一个有界大小,它是强制参数,所以它不能是无界的。即使对于单线程,JDK也以相同的方式实现了它:新的ThreadPoolExecutor(1,1,0L,TimeUnit.millides,new LinkedBlockingQueue()您在谈论maximumPoolSize吗?从javadoc来看,它是池中允许的最大线程数。没有指定内部队列的大小。此外,正如您所说,还有一个新的LinkedBlockingQueue(),它实际上被限定为整数。MAX_VALUE我指的是初始池大小,它与最大池大小相同。因此,它将在第一个实例中创建maximumPoolSize。我是说线程池和LinkedBlockingQueue的大小是两个不同的东西。线程池为5并不意味着设置一个5个线程的队列。线程池为5意味着您要分配5个线程来进行一些计算。如果线程池被“淹没”,即
活动任务比线程多,那么内部队列将增长!更多关于线程池的信息:在FixedThreadPool中,队列的初始数量(第一个参数)与最大线程数(第二个参数)完全相同,并且我们给出了一个强制参数,因此它不能是无界的。即使对于单个线程,JDK也以相同的方式实现了它:new ThreadPoolExecutor(1,1,0L,TimeUnit.millizes,new LinkedBlockingQueue()您在谈论maximumPoolSize吗?从javadoc来看,它是池中允许的最大线程数
。没有指定内部队列的大小。此外,正如您所说,还有一个新的LinkedBlockingQueue(),它实际上被限定为整数。MAX_VALUE我指的是初始池大小,它与最大池大小相同。因此,它将在第一个实例中创建maximumPoolSize。我是说线程池和LinkedBlockingQueue的大小是两个不同的东西。线程池为5并不意味着设置一个5个线程的队列。线程池为5意味着您要分配5个线程来进行一些计算。然后,如果线程池被“淹没”,即
活动任务比线程多,则内部队列将增长!线程池的更多信息: