2015-06-07 6 views
0

У меня есть POJO BusStop, у которого есть название автобусной остановки и сколько пассажиров.Несколько потоков, работающих на одном объекте

public class BusStop{ 
    private String name; 
    private Integer passengers; 
    //setters getters constructor 
    public void removePassengers(Integer i){ 
     synchronized(passengers){ 
      this.passengers = this.passengers - i; // right now I allow them to go below zero for the sake of just testing threads; 
     } 
    } 

    public void increasePassengers(Integer i){ 
     synchronized(passengers){ 
      this.passengers = this.passengers + i; 
     } 
    } 
} 

И объект BusRide, который содержит источник, автобусную остановку от кольца назначения и сколько пассажиров в настоящее время в этой поездке.

public class BusRide implements Runnable{ 

    private BusStop source; 
    private BusStop destination 
    private Integer passengers; 

    public BusRide(BusStop src, BusStop dest){ 
     this.source = src; 
     this.destination = dest; 
    } 
    //setters getters 

    @Override 
    public void run(){ 
     setPassengers(15); 
     this.source.removePassengers(15); 
     setPassengers(0); 
     this.destination.increasePassengers(15); 
    } 
} 

Основной класс:

public class Main{ 

    public static void main(String[] args){ 
      BusStop a = new BusStop("Bus-stop 1", 50); 
      BusStop b = new BusStop("Bus-stop 2", 45); 
      BusStop c = new BusStop("Bus-stop 3", 62); 

      Thread t1 = new Thread(new BusRide(a,b)); 
      Thread t2 = new Thread(new BusRide(a,c)); 
    } 

} 

В моем главном классе я хочу создать 2 нити BusRide, которые собираются принять случайное число пассажиров от источника Автобусная остановка в Автобусная остановка назначения. Но я хочу, чтобы потоки BusRide берут пассажиров из объекта, который я им дал, но вместо этого у них есть свои собственные экземпляры объекта BusStop. Итак, как мне сделать два потока работать на том же объекте BusStop, который я им дал?

+0

Я не выяснить проблему. Оба «BusRide» по-прежнему влияют на один и тот же экземпляр «BusStop», на который ссылается 'a'. Разве вы этого не ожидаете? – Mik378

+0

Кстати, зачем делать этот метод приватным? 'private void removePassengers (Integer i)'? Весь код не компилируется. – Mik378

+0

Да, извините, это был несчастный случай, он должен быть публичным. Но моя проблема в том, что она по-прежнему не работает, по какой-то причине потоки не меняют количество пассажиров BusStop. Так как в потоках не удается изменить поле данных объектов. – Alighieri

ответ

1
public void removePassengers(Integer i){ 
    synchronized(passengers){ 
     this.passengers = this.passengers - i; // right now I allow them to go below zero for the sake of just testing threads; 
    } 
} 

public void increasePassengers(Integer i){ 
    synchronized(passengers){ 
     this.passengers = this.passengers + i; 
    } 
} 

Выше неправильно. Он должен быть

public synchronized void removePassengers(Integer i){ 
    this.passengers = this.passengers - i; // right now I allow them to go below zero for the sake of just testing threads; 
} 

public synchronized void increasePassengers(Integer i){ 
    this.passengers = this.passengers + i; 
} 

В самом деле, вы синхронизация на пассажирах, но назначить пассажир на другое значение внутри синхронизированного блока, по сути делает возможным для двух потоков для вызова методов одновременно. Всегда делайте переменную final, если вы используете ее как блокировку.

0

Пожалуйста, попробуйте это. Темы не запускались.

/** * */ пакет com.philips.webcms.foundation.catalog.products.utils.test;

/** * @author AV262488 */ общественного класса ThreadTest {

/** 
* @param args 
*/ 
public static void main(String[] args) 
{ 
    BusStop a = new BusStop("Bus-stop 1", 50); 
    BusStop b = new BusStop("Bus-stop 2", 45); 
    BusStop c = new BusStop("Bus-stop 3", 62); 

    Thread t1 = new Thread(new BusRide(a, b)); 
    Thread t2 = new Thread(new BusRide(a, c)); 
    t1.start(); 
    t2.start(); 

    System.out.println(a.getPassengers()); 

} 

}

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