要使用Java ThreadPoolExecutor和BlockingQueue

在Queuing部分下的Oracle站点(
http://docs.oracle.com/javase/7/docs/api/?java/util/concurrent/ThreadPoolExecutor.html)中,它提到“如果corePoolSize或更多线程正在运行,Executor总是更喜欢排队请求而不是添加新线程.”

我们的代码很多,corePoolSize为1,maximumPoolSize为10或20.
(1)这是一种不好的做法吗?或者不是使用ThreadPool的最佳方式?
(2)在创建ThreadPoolExecutor时,您是否建议将corePoolSize和maximumPoolSize值相同?

另一个问题是在创建ThreadPoolExecutor时使用BlockingQueue – 在LinkedBlockingQueue或ConcurrentLinkedQueue之间?我从锁定和性能的角度来看更多吗?虽然运行测试证明,但与其他版本相比,插入concurrentLinkedQueue非常快.有什么想法吗?

编辑:

第一部分已在各种问题中得到回答.我喜欢的那个
How to get the ThreadPoolExecutor to increase threads to max before queueing?

最佳答案 请找到下面的点.

>如果将新任务提交到要执行的任务列表,并且
如果corePoolSize线程正在运行,则会创建一个新线程
处理请求.传入的任务排队等待
corePoolSize或更多线程正在运行.
>如果请求无法排队或者少于corePoolSize
线程运行,创建一个新线程,除非这会超过
maximumPoolSize.
>如果池当前有多个corePoolSize线程,则多余
如果线程空闲的时间超过了,则终止线程
KeepAliveTime的.
>如果将新任务提交到要执行的任务列表中
有多个corePoolSize但小于maximumPoolSize
如果线程正在运行,则只有在队列出现时才会创建新线程
充分.这意味着当使用Unbounded队列时,不再有线程
比corePoolSize会运行而keepAliveTime没有
影响.
>如果corePoolSize和maximumPoolSize相同,则为固定大小
使用线程池

你的ThreadPool大小

核心池大小为1.

最大池大小为10或20.

问题1:这是一种不好的做法吗?或者不是使用ThreadPool的最佳方式?

它基于您使用的池.

如果使用有界队列,则一旦达到有界队列的最大限制,将创建最大大小的新线程.否则它将以核心池大小运行.如果您使用的是无界队列,则仅为核心池大小.

问题2:您是否建议在创建ThreadPoolExecutor时使corePoolSize和maximumPoolSize值相同?

是.这样只有你可以获得相同的线程而不是什么样的阻塞队列.即使是非阻塞队列,您也可以获得最大的线程数.

问题3 concurrentLinkedQueue与LinkedBlockingQueue

您不应该允许使用concurrentLinkedQueue,因为线程池仅支持BlockingQueue.所以你可以尝试concurrentLinkedBlockingQueue.因为concurrentLinkedBlockingQueue是无界的.但LinkedBlockingQueue是有限的.

点赞