Я пытался обмениваться сообщениями между потоками. В нижеприведенной программе я пытаюсь сделать два потока print even и dd number альтернативно. Они правильно печатают номера, но программа никогда не выходит. Я думаю, что оба потока ждут блокировки, в тупике. Пожалуйста, помогите мне в понимании, как справиться с этой ситуацией.Программа зависает бесконечно после того, как два потока печатают даже вне чисел, альтернативно
package Test;
import java.util.logging.Level;
import java.util.logging.Logger;
public class ConcurrencyTest {
public static void main(String [] args) {
Object lock = new Object();
Thread t1 = new Thread(new ThreadM("odd",lock));
Thread t2 = new Thread(new ThreadM("even",lock));
t1.setName("Odd thread");
t2.setName("Even thread");
t1.start();
t2.start();
}
}
class ThreadM implements Runnable{
int start;
int max;
Object lock;
String startAt;
public ThreadM(String startAt, Object lock) {
this.start = 1;
this.startAt = startAt;
this.lock = lock;
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
try {
if("even".equals(startAt)) {
printEven();
} else {
printOdd();
}
} catch (InterruptedException ex) {
Logger.getLogger(ThreadM.class.getName()).log(Level.SEVERE, null, ex);
}
}
private void printEven() throws InterruptedException {
while(this.start <= 100) {
if(this.start % 2 == 0) {
synchronized(lock) {
System.out.println(Thread.currentThread().getName()+"Printing even >> "+this.start);
lock.notify();
lock.wait();
}
}
this.start++;
System.out.println(Thread.currentThread().getName()+" >> "+this.start);
}
System.out.println("done");
}
private void printOdd() throws InterruptedException {
while(this.start <= 100) {
if(this.start % 2 == 1) {
synchronized(lock) {
System.out.println(Thread.currentThread().getName()+" Printing odd >> "+this.start);
lock.notify();
lock.wait();
}
}
this.start++;
System.out.println(Thread.currentThread().getName()+" >> "+this.start);
}
}
}
Вот пример вывода. Числа идут до 100 так, я вставляя последние несколько строк вывода
Even threadPrinting even >> 96
Odd threadPrinting odd >> 97
Even threadPrinting even >> 98
Odd threadPrinting odd >> 99
Even threadPrinting even >> 100
Темы печать точно до 100 повесьте трубку
Вы должны смотреть на нить свалку, чтобы получить подсказки о том, где ваши нити застрял. – aliher
После печати вы всегда ждите, так что он будет висеть на последнем результате. –