9

Java のExecutorServiceインターフェースは、同時に処理されるオブジェクトinvokeAllの Collection を受け取るメソッドを定義します。Callableただし、invokeAllメソッド自体は、すべてのタスクの実行が完了するまで待ってから戻るため、ブロッキング メソッドになります。

私のテスト環境では、これらのタスクの戻り値は気にしません。必要なのは、それらを同時に実行することだけです。これで、新しいThreadorオブジェクトを手動で作成して自分で起動できることはわかっていますが、単にorオブジェクトの Collection を作成し、それらを実行を開始してすぐに戻るメソッドに渡すことRunnableができれば、きれいにできます。 .RunnableCallable

私が説明しているメソッドを持つ既存のライブラリ Class を知っている人はいますか? いくつかの調査を行っている間、私は1つを見つけることができませんでした。

4

3 に答える 3

2

submitSに興味のある方はぜひご利用くださいFuture。(これも同様にCallable機能します)

public static List<Future<?>> submitAll(ExecutorService executor, Collection<? extends Runnable> tasks) {
    List<Future<?>> result = new ArrayList<Future<?>>(tasks.size());
    for (Runnable task : tasks) {
        result.add(executor.submit(task));
    }
    return result;
}

またはexecuteそうでない場合

public static void executeAll(ExecutorService executor, Collection<? extends Runnable> tasks) {
    for (Runnable task : tasks) {
        executor.execute(task);
    }
}

どちらの方法もタスクをキューに入れるだけで、将来のある時点で実行されます。

于 2013-08-28T16:35:45.323 に答える
0

を使用できますExecutorService.invokeAny()。1 つのスレッドが完了するまで待つ必要がありますが、すべてのスレッドが完了するわけではありません。あるいは、invokeAll のタスクのリストが既にあるので、それらを相互に処理して、ExecutorService.submitそれぞれを呼び出すことができます。余分なコードが少しありますが、それほど多くはありません...

for(Callable task : myTaskCollection)
{
   myExecutorService.submit(task);
}
于 2013-08-28T16:31:11.807 に答える