5

Java スレッドでは、リストにいくつかのスレッドを作成し、それらを開始して、メイン スレッドをjoin1 つ作成し、次に別のスレッドを作成して、すべてのプロセスが完了するのを待ってから次に進むことができます。

他のモデルでは、どのようにそれを行うかわかりません。たとえば、RootTools 3.0 Command クラスを取り上げます。、、のCommand3 つのメソッドを持つ を作成し、コールバックを使用してプロセスの最後に何かを実行できますが、複数のプロセスを待機する方法がわかりません (たとえば、複数のディレクトリのリストを表示するファイルサイズの合計)。commandOutputcommandFinishedcommandTerminated

Android Asynctask にも同様の問題があると思います。簡単にコールバックを作成できますが、複数のタスクを待機する方法はありません。私が何かを見逃していない限り?

4

3 に答える 3

2

実行中のコマンドで wait() を呼び出すことができます。

ただし、これを行う前に、wait を呼び出すコマンドのハンドラーをオフにする必要があります。RootTools.handlerEnabled を false に設定するか、個々のコマンドでコンストラクターを使用し、false を渡してそのコマンドのハンドラーを無効にすることで、すべてのコマンドに対してこれを行うことができます。

ハンドラーを使用すると、wait() を呼び出したスレッドでコールバック メソッドを呼び出そうとし、デッドロックが発生するため、これは重要です。

コマンドのハンドラーをオフにして wait() を呼び出すと、コマンドは完了時に notifyAll() を呼び出すため、スレッドが再開されます。

これのマイナス面は、作業中のスレッドでコールバック メソッドが実行されなくなるため、ハンドラーまたはその他の受け入れ可能な解決策を実装しない限り、これらのコールバック メソッドから UI 作業を行うことができないことです。これとともに。

于 2013-07-03T02:44:24.447 に答える
0

CountDownLatchを使用します。構文の強調表示を改善するために、使用例をここにコピーします (:

class Driver { // ...
  void main() throws InterruptedException {
    CountDownLatch startSignal = new CountDownLatch(1);
    CountDownLatch doneSignal = new CountDownLatch(N);

    for (int i = 0; i < N; ++i) // create and start threads
      new Thread(new Worker(startSignal, doneSignal)).start();

    doSomethingElse();            // don't let run yet
    startSignal.countDown();      // let all threads proceed
    doSomethingElse();
    doneSignal.await();           // wait for all to finish
  }
}

class Worker implements Runnable {
  private final CountDownLatch startSignal;
  private final CountDownLatch doneSignal;
  Worker(CountDownLatch startSignal, CountDownLatch doneSignal) {
    this.startSignal = startSignal;
    this.doneSignal = doneSignal;
  }
  public void run() {
    try {
      startSignal.await();
      doWork();
      doneSignal.countDown();
    } catch (InterruptedException ex) {} // return;
  }

  void doWork() { ... }
}
于 2013-07-02T06:25:00.267 に答える