Java Concurrency API为您提供了构建的Executor
和ExecutorService
接口,并附带了几个具体的实现(ThreadPoolExecutor
和ScheduledThreadPoolExecutor
)。
我是Java Concurrency的新手,并且很难找到几个非常相似的问题的答案。我没有把所有这些微不足道的问题弄得一团糟,而是决定将它们捆绑在一起,因为可能有一种方法可以一举回答它们(可能是因为我没有看到整个图片):
Executor
/ ExecutorService
吗?在什么情况下你会这样做,而不是使用我上面提到的两个具体结果?在哪些情况下,这两种结核比“本土”的东西更可取?Executor
相关的。例如,ThreadPoolExecutor
是否使用了ConcurrentLinkedQueue
来排队提交的任务?或者您(API开发人员)应该在并行化ConcurrentLinkedQueue
方法中选择并使用run()
? Basicaly,是Executor
内部使用的并发集合,还是使用它们来帮助编写非阻塞算法?Executor
使用哪些并发集合(以存储提交的任务),这是常见的做法吗?提前致谢!
答案 0 :(得分:3)
通常的做法是实现自己的Executor / ExecutorService吗?
没有。我从来没有这样做过,而且我一直在使用并发包。这些类的复杂性以及使它们“错误”的性能影响意味着在进行这样的项目之前,你应该真正仔细思考它。
我觉得需要实现自己的执行程序服务的唯一一次是我想要实现“自运行”执行程序服务。直到有朋友告诉我有一个way to do it with a RejectedExecutionHandler
。
我想要调整ThreadPoolExecutor
的行为的唯一原因是让它启动所有线程直到最大线程并且然后将作业粘贴到队列。默认情况下,ThreadPoolExecutor
启动最小线程,然后在启动另一个线程之前填充队列。不是我期望或想要的。但是,我只是从JDK复制代码并更改它 - 而不是从头开始实现它。
我不明白所有并发集合如何与Executors相关。例如,ThreadPoolExecutor是否使用ConcurrentLinkedQueue来排队提交的任务?
如果您使用Executors
辅助方法之一,那么您不必担心这一点。如果您自己实例化ThreadPoolExecutor
,则提供BlockingQueue
使用。
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());
}
对战:
ExecutorService threadPool =
new ThreadPoolExecutor(minThreads, maxThreads, 0L, TimeUnit.MILLISECONDS,
new SynchronousQueue<Runnable>());
您可以配置Executor在引擎盖下使用哪些并发集合(以存储提交的任务),这是常见做法吗?
见最后一个答案。