使用不同的线程更改类的所有实例

时间:2013-10-25 20:14:38

标签: java multithreading instance

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

}

3 个答案:

答案 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}