繁体   English   中英

线程之间的通信Java

[英]Communication between threads java

我目前正在开发一个Java项目,这让我很尴尬:我正在使用线程,所以我有一个名为“鸡”的线程,并带有一个名为“ 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;

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

不用使用全局变量,而是在构造时将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的更新对所有线程可见,例如使它们易变,或提供同步的吸气剂)。

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

在第一次获取实例(延迟)的调用中实例化对象的示例:

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

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

由于您使用的线程我会建议使用关键字synchronized的制定者改变了食物的位置,以避免多个线程在同一时间修改值(如果你打算修改它在多线程)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM