2015-05-03 2 views
1

У меня проблемы с просыпанием нитей.Не могу разбудить темы

В моей программе должен быть движущийся нить под названием «Автобус» и несколько альпинистов, которые пытаются войти в автобус, чтобы отправиться куда-то еще.

Автобус должен всегда находиться в движении (за исключением случаев, когда альпинисты должны входить/выходить), и альпинисты должны увидеть, находится ли автобус в нужном месте, чтобы они могли попасть/выехать.

Так что я сделал этот код, но я не могу заставить его работать, кажется, что автобус не может разбудить темы, но я не могу придумать другое решение, и я не знаю, что случилось ,

¿Как я могу сигнализировать, чтобы альпинисты просыпались и садились в автобус?

public class Bus extends Thread 
{ 
boolean pointA=true, pointB=false; 

public Bus() { 
    start(); 
} 

@Override 
public void run() 
{ 
    while(true) 
    { 
     waiting(); 
     goA(); 
     waiting(); 
     goB(); 
    }  
}   

public synchronized void waiting() { 
    try { 
     Thread.sleep((int)(1000)); //waiting for the climbers 
    } catch (InterruptedException ex) {} 
} 

public synchronized void goB() { 
    pointA = false; 
    try { 
     Thread.sleep((int)(1000)); //travelling 
    } catch (InterruptedException ex) {} 
    pointB = true; 
    notifyAll(); //is in B, the climbers can get out 
} 

public synchronized void goA() { 
    pointB = false; 
    try { 
     Thread.sleep((int)(1000)); 
    } catch (InterruptedException ex) {} 
    pointA = true; 
    notifyAll(); //is in A, the climbers can get in 
} 

public synchronized void enter(Climber c, ArrayThreads fA, ArrayThreads fBus){ 

     while(!pointA){ //wait until Bus reaches pointA 
      try{wait();}catch(InterruptedException e){} 
     } 
     fA.out(c);  //Leaves station 
     fBus.put(c); //Enters the bus 

     while(!pointB){ //wait until Bus reaches pointB 
     try{wait();}catch(InterruptedException e){} 
     } 

     fBus.out(c); //Leaves Bus 

} 

} 
+0

Вашего класса имеет ошибку компиляции: 'общественного синхронизированы недействительное ожидание()' «Не может переопределить окончательный метод из Object ». Перед тем, как задать вопрос, отправьте рабочий код. –

+0

какой? я не добавлял импорт, ни основной класс, ни класс альпиниста, может быть, это. Код работает для меня, но проблема в том, что альпинисты все время ждут. – Anarion321

+0

Даже если вы добавляете правильный импорт и класс Climber, вы все равно не можете переопределить метод 'wait()', поскольку он объявлен окончательным в 'Object'. Какую версию JDK вы используете? –

ответ

0

Код, который вы предоставили, содержит метод переопределения ожидания. Но в методе ожидания класса объекта конечный. Поэтому его нельзя переопределить.

В коде отсутствует проблема, вы вызываете метод wait и notifyall из того же потока.

Введенный вами код вы вызываете синхронный метод wait() и ожидаете, что другой синхронизированный метод goA() уведомит об этом, но этот метод никогда не будет вызван. Поскольку метод ожидания удерживает блокировку.

Таким образом, изменяя вам программу, которая есть две нити, одна для автобуса и один для создания альпинистов могут помочь

+0

Извините, я ошибся, когда я написал код, теперь исправлено, поток шины никогда не ждет, только вызывает метод, чтобы перевести его в спящий режим, единственный, который ждет, должен быть потолочным альпинистом в методе Enter и быть Пробудитесь в автобусной нити. – Anarion321