5

別のスレッドの結果をスレッドに待機させる必要があることがよくあります。java.util.concurrent でこれをサポートする必要があるようですが、見つかりません。

Exchangerは私が話していることに非常に近いですが、双方向です。スレッド A がスレッド B で待機するだけで、両方が相互に待機することはありません。

はい、CountDownLatch または Semaphore または Thread.wait() を使用して、計算の結果を自分で管理できることはわかっていますが、便利なクラスがどこかに欠けているようです。

私は何が欠けていますか?

アップデート

// An Example which works using Exchanger
// but you would think there would be uni-directional solution
protected Exchanger<Integer> exchanger = new Exchanger<Integer>();

public void threadA() {
    // perform some computations
    int result = ...;

    exchanger.exchange(result);
}


public void threadB() {

    // retrieve the result of threadA
    int resultOfA = exchanger.exchange(null);
}
4

7 に答える 7

7

お探しFuture<T>ですか?これは、(通常は) 作業キューに送信されたが、まだ完了していない可能性があるタスクの通常の表現です。完了ステータスを確認したり、完了するまでブロックしたりできます。

ExecutorService先物を取得する通常の方法を見てください。これは、スレッドが終了するのを待つのではなく、個々のタスクの結果を取得することに重点を置いていることに注意してください。もちろん、単一のスレッドがその存続時間内に多くのタスクを完了する場合があります。これがスレッド プールの要点です。

于 2011-03-07T16:36:59.503 に答える
5

これまでのところ、BlockingQueueが私が見つけた最良の解決策のようです。

例えば。

BlockingQueue<Integer> queue = new ArrayBlockingQueue<Integer>(1);

待機スレッドはqueue.take()結果を待つために呼び出し、生成キューはqueue.add()結果を送信するために呼び出します。

于 2011-03-07T16:42:42.823 に答える
4

JDKは、探している正確な機能を提供する便利なクラスを提供していません。ただし、実際には、それを行うための小さなユーティリティクラスを作成するのはかなり簡単です。

あなたはCountDownLatchとそれに関するあなたの好みについて言及しましたが、それでもそれを見ることをお勧めします。小さなユーティリティクラス(必要に応じて「値シンクロナイザー」)を非常に簡単に構築できます。

public class OneShotValueSynchronizer<T> {
    private volatile T value;
    private final CountDownLatch set = new CountDownLatch(1);

    public T get() throws InterruptedException {
        set.await();
        return value;
    }

    public synchronized void set(T value) {
        if (set.getCount() > 0) {
            this.value = value;
            set.countDown();
        }
    }

    // more methods if needed
}
于 2011-03-07T20:11:14.143 に答える
0

これには java.util.concurrent.CountDownLatch を使用できます。

http://download.oracle.com/javase/6/docs/api/java/util/concurrent/CountDownLatch.html

例:

CountDownLatch latch = new CountDownLatch(1);

// thread one
// do some work
latch.countDown();

// thread two
latch.await();
于 2011-03-07T17:14:45.763 に答える
0

を使用する上で不便なことは何Thread.join()ですか?

于 2011-03-07T16:37:29.117 に答える
0

私は最近同じ問題を抱えていました.Futureを使用してからCountdownLatchを使用しようとしましたが、Exchangerに落ち着きました. それらは 2 つのスレッドがデータを交換できるようにすることになっていますが、それらのスレッドの 1 つが単に null を渡すことができない理由はありません。

最終的には、それが最もクリーンなソリューションだったと思いますが、正確に何を達成しようとしているかによって異なる場合があります。

于 2011-03-07T16:41:15.397 に答える