【问题标题】:Java Concurrency: How to select and configure ExecutorsJava并发:如何选择和配置执行器
【发布时间】:2012-06-29 18:27:48
【问题描述】:

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

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

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

提前致谢!

【问题讨论】:

    标签: java concurrency


    【解决方案1】:

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

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

    我觉得需要实现自己的执行器服务的唯一一次是当我想实现一个“自运行”的执行器服务时。直到一个朋友告诉我有一个way to do it with a 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 在后台使用哪些并发集合(用于存储提交的任务),这是常见的做法吗?

    查看最后一个答案。

    【讨论】:

    • 感谢@Gray (+1) - 总而言之,我将一直使用ThreadPoolExecutorScheduledPoolExecutor 以及我将永远使用的only时间并发集合是当我使用它来创建这两种类型之一的新实例时? BlockingQueue 没有理由作为我的非阻塞算法的一部分出现在我的 run() 方法中,是吗?只是想确保我完全理解!
    • 就执行者而言是的。我一直使用并发集合在线程之间进行通信,但您不必担心它们与执行程序服务有关。没有理由在您的 run() 方法中引用 Runnable 阻塞队列。
    • 在此处查看我的示例以设置拒绝处理程序。这引用了队列,但同样,不是在 run() 方法中:stackoverflow.com/questions/11249342/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-15
    • 2017-08-28
    • 2021-12-25
    • 1970-01-01
    相关资源
    最近更新 更多