【问题标题】:How to create a cyclic exchange of three threads?如何创建三个线程的循环交换?
【发布时间】:2013-05-23 08:05:08
【问题描述】:

如何创建三个线程的循环交换?即:first线程必须向second发送数据,secondthirdthird 线程必须先发送数据到

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

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

【问题讨论】:

  • 将一个线程的引用传递给下一个。
  • 我如何使用这个参考来实现它?
  • 你有Loop loop1,将它传递给下一个循环的构造函数或者使用一个setter,因为它是循环依赖。
  • 我需要将一个线程的引用传递给我理解的下一个。但我不明白如何在运行中使用它来交换数据。类似于: if (this.name.equals("Third") && this.next.equals("Firs")) 或者不是?
  • 是的,类似的,但你不会启动线程,直到它们被正确初始化。此外,您处于多线程环境中,因此请对synchronized 采取适当的预防措施。

标签: java multithreading


【解决方案1】:

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

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

也供参考Best way of running two threads alternatively?

还有为什么你需要三个线程?你可以使用线程池并让每个任务都做 3 件事吗?

【讨论】:

  • 我需要三个线程,因为这是任务。感谢您的帮助。现在尝试按照你的建议去做,但我不完全理解你的想法 adout //“所以线程 1 将在 1 和 2 之间(输出 1 到 2),线程 2 将在 2 和 3 之间,线程 3 的交换器将是在它自己和 1 之间。"// 你能给我举个例子吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多