[英]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.