ジョブを2つのバッチで送信するか、明示的な「happens-before」関係を作成する必要があります。ジョブの2つのバッチを作成し、使用することをお勧めしますinvokeAll(batch1); invokeAll(batch2);
。このinvokeAll()
メソッドはすべてのタスクを実行し、完了するまでブロックします。Runnable
sをsとしてラップする必要がある場合がありCallable
ます。これは、で行うことができますExecutors.callable(Runnable r)
。(@Cameron Skinnerは、コード例を取得するために私を打ち負かしました。詳細については、その回答を参照してください...)
エグゼキュータの全体的なポイントは、実行の詳細を抽象化することであるため、明示的に指定されていない限り、順序付けは保証されません。厳密に順次実行する場合は、実行しているスレッド(最も単純)で実行するか、シングルスレッドのエグゼキューターalaExecutors.newSingleThreadExecutor()
で実行するか、タスクを明示的に同期します。後者を実行する場合は、バリアまたはラッチを使用して、依存タスクをバリア/ラッチでブロックすることができます。また、タスクの最初のブロックに実装Callable
、returnFuture
を設定し、依存タスクを呼び出しmyFuture.get()
て、結果が返されるまでブロックさせることもできます。
特定のアプリケーションについて詳しくお話しいただければ、より具体的にサポートできる可能性があります。