Java Concurrency:如何选择和配置Executors

时间:2012-06-29 18:27:48

标签: java concurrency

Java Concurrency API为您提供了构建的ExecutorExecutorService接口,并附带了几个具体的实现(ThreadPoolExecutorScheduledThreadPoolExecutor)。

我是Java Concurrency的新手,并且很难找到几个非常相似的问题的答案。我没有把所有这些微不足道的问题弄得一团糟,而是决定将它们捆绑在一起,因为可能有一种方法可以一举回答它们(可能是因为我没有看到整个图片):

  • 通常的做法是实施自己的Executor / ExecutorService吗?在什么情况下你会这样做,而不是使用我上面提到的两个具体结果?在哪些情况下,这两种结核比“本土”的东西更可取?
  • 我不明白所有并发集合是如何与Executor相关的。例如,ThreadPoolExecutor是否使用了ConcurrentLinkedQueue来排队提交的任务?或者您(API开发人员)应该在并行化ConcurrentLinkedQueue方法中选择并使用run()? Basicaly,是Executor内部使用的并发集合,还是使用它们来帮助编写非阻塞算法?
  • 您可以配置Executor使用哪些并发集合(以存储提交的任务),这是常见的做法吗?

提前致谢!

1 个答案:

答案 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在引擎盖下使用哪些并发集合(以存储提交的任务),这是常见做法吗?

见最后一个答案。