У меня возникли проблемы с попыткой выяснить, как работает код ниже. На выходе я получаю, что все потоки говорят, что они сонные, тогда либо Thread-1, либо Thread-0 просыпается, и программа зависает.Как работают эти спальные нити?
Я понимаю, что Thread-1 или Thread-0 просыпается, потому что threads[5]
называется функцией notify()
, поэтому первый поток в наборе ожидания возвращается к жизни. Но ... если поток в threads[5]
был заблокирован, потому что ему был вызван wait()
, как он мог бы еще вызвать функцию wakeUp()
?
Если так или иначе он может вызывать методы, почему функция wakeUpAll()
не работает? И почему он работает, если я сплю главный поток?
public class SleepingThreads extends Thread
{
Object lock;
public SleepingThreads(Object l) { lock=l; }
public void run()
{
System.out.println(this.getName()+" said: I am sleepy...");
synchronized(lock)
{
try { lock.wait(); } catch (InterruptedException e){}
System.out.println(this.getName()+" said: but now I woke up...");
}
}
public void wakeUp() { synchronized (lock) { lock.notify(); } }
public void wakeUpAll() { synchronized (lock) { lock.notifyAll(); } }
public static void main(String[] args) throws InterruptedException
{
Object lock = new Object();
SleepingThreads[] threads = new SleepingThreads[10];
for (int i=0; i<10;i++)
{
threads[i] = new SleepingThreads(lock);
threads[i].start();
}
threads[5].wakeUp();
//currentThread().sleep(200);
threads[5].wakeUpAll();
System.out.println("Done.");
}
}
Я думаю, что я должен хотя бы получить голос, я пытался сказать вам, что основной поток был тот, кто исполнил .. =) –
Общий принцип: если у вас есть 'wait' без цикла while, чтобы проверить состояние, вы (почти) гарантированно ожидаете ошибку. – Voo
спасибо! Мне нужны дем-очки. –