【问题标题】:Java - ExecutorService for fixed number of tasksJava - ExecutorService 用于固定数量的任务
【发布时间】:2012-12-14 15:59:18
【问题描述】:

我想使用 Java 中的 ExecutorService 实现以下行为。我有大量任务要完成,这些任务都可以并行完成。我想通过以下方式从我的主线程中安排 N 个任务:

  • 如果活动任务的数量是 调度新任务(执行器服务已经这样做了)
  • 否则,在主线程上阻塞,直到其中一个任务完成 => 几乎与将 N 个第一个任务存储在队列中然后将第一个任务出队并在其上调用 get() 相同)

有没有办法像上面所说的那样调整 ExecutorService?

【问题讨论】:

  • 那不是固定的线程池执行器吗?

标签: java concurrency executorservice executor


【解决方案1】:

使用 N 个线程的 ThreadPoolExecutor,由 SynchronousQueue 构造。每次向线程池提交任务时,主线程都会被同步队列阻塞,直到池中的线程从队列中取出任务。

【讨论】:

  • 你能详细说明同步队列是如何阻塞主线程的吗?
  • 阅读它的 javadoc。那里都有解释。
  • 请注意,您对为什么要阻塞主线程的解释并不真正相关。最终,主线程会继续执行,但仍然会有 N 个文件正在被线程池处理。为什么不把所有的东西都提交到一个固定的线程池中,然后等待返回的期货呢?
  • 那么把400K的future全部存入内存,一一处理?我在一个对象上调用一个方法,它不知道将存储多少结果,所以它不知道何时开始处理结果
  • 这个答案是错误的。用 SynchronousQueue 构造 ThreadPoolExecutor 不会使主线程暂停。当线程池繁忙时,它会立即拒绝任务。
【解决方案2】:

你可以将 N 个任务提交给一个 ExecutorCompletionService,然后在一个循环中:

Future<?> f = executor.take(); //blocks until one task completes
executor.submit(nextTask());

通过这样做,您可以确保不再有 N 个任务同时在执行程序中排队。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-15
    相关资源
    最近更新 更多