线程java之间的通信

时间:2015-11-04 22:34:07

标签: java multithreading communication

我目前正在开发一个java项目,有些东西让我感到尴尬: 我使用线程,所以我有一个名为" chicken"的线程,有一个名为" direction()"的方法,其中我给了一个X和一个Y在哪里必须去。

然后我在线程的run()方法中使用此方法。

this.direction(NX,NY);

我还有一个名为" test1"的主类,其中我开始了鸡,&我也有食物"类:

Chicken C1=new Chicken(50,750,1,true);
Chicken C2=new Chicken(750,750,2,true);
Chicken C3=new Chicken(200,50,3,true);

        C1.start();
        C2.start();
        C3.start();
 Food F1=new food(x,y);

食物的位置由玩家用他的鼠标选择。

问题是,值x和y经常变化,因为鸡必须朝向食物,并且位置只能在食物类/ test1中找到 现在,我在Test1中创建了一个全局变量,我可以随时更改它,并且我在线程鸡中使用,例如:

NX=Test1.x;
NY=Test1.y;

我不喜欢使用全局变量,还有另一种方法吗?

2 个答案:

答案 0 :(得分:3)

不是使用全局变量,而是将Food的实例注入每个Chicken s'在施工时间:

Food food = new Food(x, y);
Chicken C1=new Chicken(50,750,1,true,food);
Chicken C2=new Chicken(750,750,2,true,food);
Chicken C3=new Chicken(200,50,3,true,food);

并将其存储在Chicken上的成员变量中。然后你可以使用例如this.direction(food.x, food.y)(尽管您需要一些方法来确保所有线程都可以看到x和y的更新,例如使它们变得易变,或者提供同步的getter)。

答案 1 :(得分:0)

不应使用全局变量,而应将food类实现为单例设计模式(https://en.wikipedia.org/wiki/Singleton_pattern) 此设计模式确保您的对象仅实例化一次,您可以使用静态类方法(通常称为getInstance)检索该唯一实例。 构造函数应该是私有的,以防止您实例化以保证唯一的实例。

在第一次调用get实例(lazy)时实例化对象的示例:

public class Singleton {
    private static Singleton instance = null;
    private Singleton() {}

    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

由于您正在使用线程,我建议在设置器上使用关键字synchronized来更改食物的位置,以避免多个线程同时修改该值(如果您打算在多个线程中修改它) )。