Как сделать так, чтобы два потока, печатающие четные нечетные числа, поддерживали четный сначала нечетный порядок для этой реализации?
Я создал два запускаемых задания: PrintEvenNumbersJob и PrintOddNumbersJob и создал два потока для выполнения этих заданий. Кажется, это работает отлично! Но я чувствую что-то подозрительное в этой реализации. Могу ли я получить некоторые комментарии и советы по этой реализации?
Проблема, которую я вижу в этой реализации, состоит в том, что программа завершается только тогда, когда поток1 получает блокировку для блокировки объекта первым, в противном случае она печатает нечетные первый и четный второй порядок и не завершается, если я не предоставлю еще один оператор «lock.notify» после для утверждения в PrintEvenNumbersJob (как в этой реализации). Мой вопрос здесь заключается в том, как убедиться, что thread1 выполняется первым.
public class PrintEvenNumbersJob implements Runnable {
private Object lock;
public PrintEvenNumbersJob(Object lock) {
this.lock = lock;
}
@Override
public void run() {
synchronized (lock) {
for (int i = 0; i <= 10; i += 2) {
lock.notify();
System.out.println(i);
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
lock.notify(); // not required if thread1 gains lock first
}
}
}
public class PrintOddNumbersJob implements Runnable {
private Object lock;
public PrintOddNumbersJob(Object lock) {
this.lock = lock;
}
@Override
public void run() {
synchronized (lock) {
for (int i = 1; i < 10; i += 2) {
lock.notify();
System.out.println(i);
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
lock.notify();
}
}
}
public class EvenOddManager {
public static void main(String[] args) {
Object lock = new Object();
PrintEvenNumbersJob printEvenNumbersJob = new PrintEvenNumbersJob(lock);
PrintOddNumbersJob printOddNumbersJob = new PrintOddNumbersJob(lock);
Thread thread1 = new Thread(printEvenNumbersJob);
Thread thread2 = new Thread(printOddNumbersJob);
thread2.start();
thread1.start();
}
}