Java交换机示例不工作

Java交换机示例不工作,java,concurrency,java.util.concurrent,Java,Concurrency,Java.util.concurrent,我有以下代码。代码创建了两个Runnable,分别带有消息“Hello”和“World”。 我希望它能和“世界”交换“你好”,但它不起作用。代码被卡住,交换永远不会发生 更改代码如下。现在可以用了 public class ExchangerExample { public static void main(String[] args) { Exchanger<String> exchanger = new Exchanger(); new Thread(() -

我有以下代码。代码创建了两个Runnable,分别带有消息“Hello”和“World”。 我希望它能和“世界”交换“你好”,但它不起作用。代码被卡住,交换永远不会发生

更改代码如下。现在可以用了

public class ExchangerExample {

public static void main(String[] args) {
    Exchanger<String> exchanger = new Exchanger();

    new Thread(() -> {
        try {
            String message = "Hello";
            Object previous = message;
            message = exchanger.exchange(message);
            System.out.println(previous + " is changed to " + message);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }).start();

    new Thread(() -> {
        try {
            String message = "World";
            Object previous = message;
            message = exchanger.exchange(message);
            System.out.println(previous + " is changed to " + message);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }).start();
}
公共类交换示例{
公共静态void main(字符串[]args){
交换器=新交换器();
新线程(()->{
试一试{
String message=“Hello”;
对象前一个=消息;
message=交换器.exchange(message);
System.out.println(先前的+”更改为“+消息);
}捕捉(中断异常e){
e、 printStackTrace();
}
}).start();
新线程(()->{
试一试{
字符串message=“World”;
对象前一个=消息;
message=交换器.exchange(message);
System.out.println(先前的+”更改为“+消息);
}捕捉(中断异常e){
e、 printStackTrace();
}
}).start();
}

}首先,这不是编写此类程序的好设计,看起来像spagetti代码,首先编写一个
ExchangerRunnable
类:

public class ExchangerRunnable implements Runnable{

    Exchanger exchanger = null;
    Object    object    = null;

    public ExchangerRunnable(Exchanger exchanger, Object object) {
        this.exchanger = exchanger;
        this.object = object;
    }

    public void run() {
        try {
            Object previous = this.object;

            this.object = this.exchanger.exchange(this.object);

            System.out.println(
                    Thread.currentThread().getName() +
                    " exchanged " + previous + " for " + this.object
            );
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
然后,您可以将其作为书面形式使用:

Exchanger exchanger = new Exchanger();

ExchangerRunnable exchangerRunnable1 =
        new ExchangerRunnable(exchanger, "Hello");

ExchangerRunnable exchangerRunnable2 =
        new ExchangerRunnable(exchanger, "World");

new Thread(exchangerRunnable1).start();
new Thread(exchangerRunnable2).start();
输出将是:

Thread-0 exchanged Hello for World
Thread-1 exchanged World for Hello

有什么问题吗?

你的程序和我配合得很好,打印
世界变为Hello Hello改为World