Java 交换机:JVM从不停止

Java 交换机:JVM从不停止,java,multithreading,synchronize,Java,Multithreading,Synchronize,为什么JVM从未在这里退出?您的线程中有一个交换点,但主线程中有两个交换点。所以第二个交换:String s=exchanger.exchange(“这来自主线程”)永远等待并阻止JVM退出。如果在该行之后添加一个print语句,您将看到它没有被执行 如果在线程中添加第二个exchange,程序将退出: mainthis came from subthread Thread-0this came from main thread 最后一行: public void run() { tr

为什么JVM从未在这里退出?

您的线程中有一个交换点,但主线程中有两个交换点。所以第二个交换:
String s=exchanger.exchange(“这来自主线程”)永远等待并阻止JVM退出。如果在该行之后添加一个print语句,您将看到它没有被执行

如果在线程中添加第二个exchange,程序将退出:

mainthis came from subthread
Thread-0this came from main thread
最后一行:

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");
    }
}

提供
“这来自主线程”
,用于与其他线程交换,但没有其他线程进行还盘。

如果删除主方法中的最后一行怎么办?当然,这是我提出的一个愚蠢的问题。。有一次复制粘贴导致此错误。。。我应该在这里看到我的代码。。在eclipse上,不知何故,这两行是并排粘贴的,所以我完全没有看到它(@assylias也这么认为并尝试过。但它没有退出jvm,尽管您提到的方法有效。@SubinS我刚刚尝试过,它确实有效。基本上,只要主线程和另一个线程中的交换次数相同,jvm就会退出。@assylias:-),我不知道为什么,但最后一行的逗号没有退出jvm,但是,如果我删除该行,它就会工作。我想这和我的日食有关。
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");
    }
}
String s = exchanger.exchange("this came from main thread");