0

私は次のようなエグゼキューターサービスを持っています:

ExecutorService exec = Executors.newFixedThreadPool(4);
for(int i=0; i<4;i++) {
  Consumer consumer = new Consumer();
  exec.execute(new ConsumerstartUpThread(consumer));
}

ConsumerStartUpThreadrunnable を実装しており、その run メソッドには非常に多くの機能があり、他のいくつかの API を呼び出す必要があります。コードをデバッグ モードで実行すると、タスクが完了します。通常どおり実行すると、タスクが不完全になり、スレッドが終了します。すべてのタスクが完了するまでスレッドが待機するということではありませんか? タスクを完了せずに終了するのはなぜですか?

4

1 に答える 1

1

試す

ExecutorService exec = Executors.newFixedThreadPool(4);
List<Callable<Object>> tasks = new ArrayList<Callable<Object>>();
for (int i = 0; i < 4; i++) {
    tasks.add(Executors.callable(new ConsumerstartUpThread(new Consumer())));
}
exec.invokeAll(tasks);
exec.shutdown();

invokeAll は、すべてのタスクが終了するまで待機します (API を参照)。簡単にするために、ConsumerstartUpThread が Runnable の代わりに Callable を実装するようにします。

于 2013-02-14T06:21:24.377 に答える