Wie kann sichergestellt werden, dass bei dieser Implementierung zwei Threads, die gerade und ungerade Zahlen drucken, zuerst die gerade und dann die ungerade Reihenfolge beibehalten?

Ich habe zwei ausführbare Jobs erstellt: PrintEvenNumbersJob und PrintOddNumbersJob und zwei Threads erstellt, um diese Jobs auszuführen. Das scheint völlig in Ordnung zu sein! Aber ich rieche etwas Verdächtiges an dieser Implementierung. Kann ich einige Kommentare und Ratschläge zu dieser Implementierung haben?

Das Problem, das ich bei dieser Implementierung sehe, ist, dass das Programm nur beendet wird, wenn thread1 zuerst die Sperre für die Objektsperre erhält, andernfalls wird die ungerade erste gerade zweite Ordnung ausgegeben und nicht beendet, es sei denn, ich gebe noch eine weitere Anweisung "lock.notify" nach for-Anweisung in PrintEvenNumbersJob (wie in dieser Implementierung). Meine Frage hier ist, wie Sie sicherstellen, dass Thread1 zuerst ausgeführt wird.

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();

}

}

Antworten auf die Frage(3)

Ihre Antwort auf die Frage