Как сделать так, чтобы два потока, печатающие четные нечетные числа, поддерживали четный сначала нечетный порядок для этой реализации?

Я создал два запускаемых задания: 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();

}

}

Ответы на вопрос(3)

Ваш ответ на вопрос