2015-11-04 4 views
0

В настоящее время я работаю над проектом java, и что-то меня смущает: Я использую потоки, поэтому у меня есть поток под названием «chicken» с методом под названием «direction()», в который я даю X и Y, куда он должен идти.Связь между потоками java

Затем я использую этот метод в методе 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 часто меняются, так как курица должна идти к пище, а положение можно найти только в классе продуктов питания/в тесте1 . Теперь я сделал глобальную переменную в Test1, что я могу изменить, когда я хочу и что я использую в резьбе курица, как:

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

мне не нравится, используя глобальную переменную, есть другой способ сделать это?

+0

Что такое 'направление' в отношении' move'? –

+0

oops my error, I edit – EmS

+1

У вас есть конкретная причина для выполнения отдельных компонентов в разных потоках? –

ответ

0

Вместо того, чтобы использовать глобальную переменную, вы должны реализовать класс продуктов питания в качестве шаблона дизайна одноплодной (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 на сеттеров, изменяющих положение пищи для избегайте одновременного изменения нескольких потоков при одновременном изменении значения (если вы намерены изменить его в нескольких потоках).

+0

Почему эта глобальная переменная отличается от текущей глобальной переменной? Какое преимущество дает ленивая инициализация? –

+0

Теоретически для его случая нет реального преимущества, но предоставленный интерфейс делает его очень простым в использовании, вызывая общие методы класса в его программе.Ленивая инициализация заставляет его контролировать и гарантировать, что экземпляр пищи не создается, прежде чем он захочет. –

+0

Однако я бы порекомендовал ваш ответ, поскольку он кажется более естественным, но все же я бы использовал синхронизированное ключевое слово в методах объектов пищи. –

3

Вместо того, чтобы использовать глобальную переменную, впрыснуть экземпляр Food в каждой из ваших Chicken с во время строительства:

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 были видны для всех потоков, например, для их изменения или обеспечения синхронизированных геттеров).

Смежные вопросы