簡體   English   中英

Java Exchanger示例不起作用

[英]Java Exchanger example not working

我有以下代碼。該代碼分別創建兩個帶有消息“ Hello”和“ World”的可運行對象。 我希望這可以與“世界”交換“ Hello”,但是它不起作用。 代碼被卡住,交換永遠不會發生

更改代碼如下。 現在可以使用

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

}

首先,這不是編寫此類程序的好設計,看起來像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

任何問題 ?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM