0
public static void main(String[] args) throws Exception {
    final Exchanger<String> exchanger = new Exchanger<String>();
    new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                System.out.println(Thread.currentThread().getName() + exchanger.exchange("this came from subthread"));
            } catch (InterruptedException ex) {
                System.out.println("interrupted while waiting for message");
            }
        }
    }).start();

    System.out.println(Thread.currentThread().getName() + exchanger.exchange("this came from main thread"));
    String s = exchanger.exchange("this came from main thread");
}

出力

mainthis came from subthread
Thread-0this came from main thread

JVM がここで終了しないのはなぜですか?

4

2 に答える 2

2

スレッドには 1 つの交換ポイントがありますが、メイン スレッドには 2 つの交換ポイントがあります。したがって、2 番目の交換:String s = exchanger.exchange("this came from main thread");永久に待機し、JVM が終了しないようにします。その行の後に print ステートメントを追加すると、実行されないことがわかります。

スレッドに 2 つ目の交換を追加すると、プログラムは終了します。

public void run() {
    try {
        System.out.println(Thread.currentThread().getName() + exchanger.exchange("this came from subthread"));
        exchanger.exchange("allow JVM to exit here");
    } catch (InterruptedException ex) {
        System.out.println("interrupted while waiting for message");
    }
}
于 2012-12-21T09:58:33.340 に答える
0

最後の行:

String s = exchanger.exchange("this came from main thread");

他のスレッドとの交換を申し出ます"this came from main thread"が、反対の申し出をするスレッドは他にありません。

于 2012-12-21T10:01:20.370 に答える