0

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

我对 Java Concurrency 完全陌生,很难找到几个非常相似的问题的答案。我决定将它们捆绑在一起,而不是把所有这些小问题弄得一团糟,因为可能有一种方法可以一口气回答它们(可能是因为我在这里没有看到全貌):

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

提前致谢!

4

1 回答 1

3

实现自己的 Executor/ExecutorService 是常见的做法吗?

不,我从来没有这样做过,而且我使用并发包已经有一段时间了。这些类的复杂性以及使它们“错误”对性能的影响意味着在进行这样的项目之前你应该仔细考虑一下。

唯一一次我觉得需要实现我自己的执行器服务是当我想实现一个“自运行”的执行器服务时。直到一位朋友向我展示了一种使用RejectedExecutionHandler.

我想要调整行为的唯一原因ThreadPoolExecutor是让它启动所有线程,直到最大线程数,然后将作业放入队列中。默认情况下,ThreadPoolExecutor启动 min-threads,然后在启动另一个线程之前填充队列。不是我期望或想要的。但是我只是从 JDK 中复制代码并对其进行更改——而不是从头开始实现它。

我不明白所有并发集合与 Executor 的关系。例如,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 在后台使用哪些并发集合(存储提交的任务),这是常见的做法吗?

看最后一个答案。

于 2012-06-29T18:31:35.920 回答