мне нужно ждать, пока список нити не прекращается, но мой код работает только тогда, когда сон не является постоянной величиной я хочу knwo почему, вот мой тест Класса:Подождите, пока список нити не конец
Если я изменить Thread.sleep (200); ---> Thread.sleep (i * b); его работы прекрасны!?
public class TestThread {
public static void main(String[] args) {
Object lock = new Object();
for (int p=0; p<10; p++) {
final int i=p;
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("notify "+i);
synchronized(lock){
lock.notify();
}
}
}).start();
}
Integer counter=0;
synchronized (lock) {
try {
while(true){
System.out.println("Before wait");
if (counter==10)//wait until all threads ends
break;
lock.wait();
counter += 1;
System.out.println("After wait "+counter);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("End");
}
}
Результат с notifyAll()
Before wait
notify 3
notify 7
After wait 1
Before wait
notify 1
notify 2
notify 0
After wait 2
Before wait
notify 4
After wait 3
Before wait
After wait 4
Before wait
notify 5
After wait 5
Before wait
notify 6
notify 8
After wait 6
Before wait
notify 9
After wait 7
Before wait
After wait 8
Before wait
И этот процесс не прекращается
Я не знаком с многопоточными, так что, пожалуйста ... –
Почему бы вам просто не использовать обратный отсчет? Инициализируйте его количеством потоков и сделайте потоки подсчитанными при завершении. Затем ждите на защелке - вуаля, проблема решена. – Ordous
'lock.notify' ничего не делает, если никто не ждет. Это относится к вашему журналу 'notify 7'. Когда вы вызываете 'wait', вы отпускаете фиксатор на' lock', который, в свою очередь, берется двумя нитями, уже ожидающими в затворе блока 'synchronized'.Поэтому один из потоков 'notify()' тратится впустую. – njzk2