-1

我编写了一段代码,其中创建了一个类的多个实例,每个实例都有自己的线程。但是,当其中一个实例满足条件时(在这种情况下,当它的 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) {}
        }
    }

}
4

3 回答 3

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}
于 2013-10-25T20:36:38.787 回答
0

首先,Java 中任何类都只有一个实例——类是静态的。我认为您正在创建属于该类类型的对象的实例。这听起来像是在争论语义,但“类作用域”与“实例作用域”不同,因此它是一个重要的信息。

您可能想从 oracle 的 Java 并发课程开始。您描述的核心问题(线程通信)很常见。您应该能够从 Google 获得大量信息。但简而言之——您需要一条在所有线程之间共享的公共信息。

于 2013-10-25T20:27:21.830 回答
0

不确定为什么您需要多个线程来执行此操作,因为使用多个线程更有可能使您的模拟器 a) 变慢 b) 不可重现,因为无法保证线程何时运行或运行多长时间。

您可以通过更改确定方向的字段来更改方向。为了能够访问它们,我建议您将它们放在可以访问的集合中。不用说你必须这样做是一种线程安全的方式,因为你有多个线程。

如果您不确定如何执行此操作,我建议您只使用一个线程开始并在您知道如何并且确定它会有所帮助时更改为多个线程。

于 2013-10-25T20:23:23.653 回答