我编写了一段代码,在其中我创建了一个类的多个实例,每个实例都有自己的线程。但是,当其中一个实例满足条件时(在这种情况下,当其x坐标是特定值时),我希望类的所有实例都改变方向。
任何人都有一些如何处理此问题的想法? 感谢。
编辑:这是代码更改对象的方向。目前,当对象的每个x坐标达到750时,对象才会发生变化。我希望一个对象达到750后,所有对象都会改变方向。public void run() {
while(thread != null) {
while(x <= 750) {
if(x == 750) y+=100;
x+=1;
try {
thread.sleep(10);
} catch(Exception e) {}
}
while(x >= 10) {
if(x == 10) y+=100;
x-=1;
try {
thread.sleep(10);
} catch(Exception e) {}
}
}
}
答案 0 :(得分:0)
不确定为什么你需要多个线程来执行此操作,因为使用多个线程更有可能使你的模拟器a)更慢b)无法生成,因为无法保证线程运行或持续多长时间。
您可以通过更改确定方向的字段来更改方向。为了能够访问它们,我建议您将它们放入可以访问的集合中。不用说,你必须这样做是一种线程安全的方式,因为你有多个线程。
如果您不确定如何执行此操作,我建议您只使用一个线程开始,并在知道如何确保它有用时更改为多个线程。
答案 1 :(得分:0)
首先,Java中只有一个类的实例 - 类是静态的。我认为您正在创建具有该类类型的对象的实例。这可能听起来像是在争论语义,但“类范围”与“实例范围”不同,因此它是一个重要的信息。
您可能希望从Java Concurrency lesson from oracle.开始。您所描述的核心问题(线程通信)非常常见。你应该能够从谷歌获得大量的信息。但简而言之 - 您需要在所有线程之间共享一条共同的信息。
答案 2 :(得分:0)
不是那么难
首先保留所有线程实例,然后每当线程满足条件,然后更改其他线程。像这样的东西。
class Foo implements Runnable{
private final static List<Foo> instances=new ArrayList<Foo>();
private volatile Direction d=Direction.U;
public changeDirection(Direction d){}
public void run(){
//
if(<<GOT THE POINT>>){
synchronized(instances){
for(Foo fx:instances){fx.changeDirection(<<Desired direction>>);}
}
}
//
}
}
enum Direction{U,B,L,R}