【发布时间】:2013-05-23 08:05:08
【问题描述】:
如何创建三个线程的循环交换?即:first线程必须向second发送数据,second向third和third 线程必须先发送数据到。
我写了一些代码,但是线程以随机顺序交换。
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