簡體   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