1

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

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

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

4

2 回答 2

4

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

于 2012-12-14T16:06:16.213 回答
0

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

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

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

于 2012-12-14T16:36:14.797 回答