0

如何创建三个线程的循环交换?即:第一个线程必须向第二个线程发送数据,第二个线程必须向第三个线程发送数据,第三个线程必须向第一个线程发送数据。

我写了一些代码,但是线程以随机顺序交换。

class DataClass {

    int value;
    String message;

    DataClass(int v, String s) {
        value = v;
        message = s;
    }

    int getValue() {
        return (value);
    }

    String getMassage() {
        return (message);
    }
}

class Loop implements Runnable {

    int counter;
    String name;
    Exchanger<DataClass> exchanger;

    Loop(int startValue, String id, Exchanger<DataClass> ex) {
        counter = startValue;
        name = id;
        exchanger = ex;
        System.out.println(name + ": created");
    }

    public void run() {
        System.out.println(name + ": started");

        DataClass data = new DataClass(counter, name);

        for (int i = 0; i < 3; ++i) {
            try {
                DataClass newData = exchanger.exchange(data);
                counter += newData.getValue();

                System.out.println(name + ": from "
                        + newData.getMassage() + ": data: "
                        + newData.getValue() + ": state = " + counter);

            } catch (InterruptedException e) {
                System.err.println(e.toString());
            }
        }
        System.out.println(name + ": ended");
    }
}

public class ExchangerDemo {

    public static void main(String args[]) {
        System.out.println("Main process started");
        Exchanger<DataClass> exchanger = new Exchanger<DataClass>();
        Loop loop1 = new Loop(1, "First", exchanger);
        Loop loop2 = new Loop(2, "Second", exchanger);
        Loop loop3 = new Loop(3, "Third", exchanger);
        new Thread(loop1).start();
        new Thread(loop2).start();
        new Thread(loop3).start();
        System.out.println("Main process ended");
    }
}
4

1 回答 1

0

对于您的依赖项,您应该创建三个类,并具有三个不同的 Exchange 对象(每个对象一个)。所以线程 1 将在 1 和 2 之间(输出 1 到 2),线程 2 将在 2 和 3 之间,线程 3 的交换器将在其自身和 1 之间。记住交换器只会保护直到它从进料器获得输入,直到它传递给它的接收器。

同步也没有书上说的那么糟糕。用它。观看http://www.youtube.com/watch?v=WTVooKLLVT8

也供参考交替运行两个线程的最佳方式?

另外为什么需要三个线程?您可以使用线程池并让每个任务完成 3 件事吗?

于 2013-05-22T21:17:27.307 回答