Я попытался напечатать нечетные и четные числа в качестве альтернативы, используя два потока. Но программа зашла в тупик. Я не могу понять, почему он заходит в тупик. В режиме отладки программа ведет себя по-другому. Он печатает 1 2, затем тупик. Это поведение является неожиданным.
Ожидаемый выход
1
2
3
4
odd thread ends here
even thread ends here
main thread ends here
Токовый выход
1
2
3
4
odd thread ends here
(Deadlock)
Вот java code
public class PrintSequence {
public static void main(String[] args) {
EvenOddPrinter printer = new EvenOddPrinter(false, 1, 4);
Thread odd = new Thread(new Runnable() {
@Override
public void run() {
printer.printOdd();
}
});
Thread even = new Thread(new Runnable() {
@Override
public void run() {
printer.printEven();
}
});
odd.start();
even.start();
try {
odd.join();
System.out.println("odd thread ends here");
even.join();
System.out.println("even thread ends here");
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("main thread ends here");
}
}
class EvenOddPrinter {
private boolean isEven;
private int index;
private int maxNumber;
public EvenOddPrinter(boolean isEven, int index, int maxNumber) {
super();
this.isEven = isEven;
this.index = index;
this.maxNumber = maxNumber;
}
public synchronized void printOdd () {
while(index < maxNumber) {
if(!isEven) {
System.out.println(index);
index++;
isEven = true;
notify();
}
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public synchronized void printEven() {
while(index <= maxNumber) {
if(isEven) {
System.out.println(index);
index++;
isEven = false;
notify();
}
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
Может кто-нибудь помочь мне исправить это?