В чем разница при использовании автономного метода wait () и любого экземпляра класса (obj.wait ()) - PullRequest
0 голосов
/ 03 декабря 2018

Я пытаюсь выполнить 2 потока чередующимся образом.Один из них печатает нечетные числа, а другой - четные числа на консоль (<= 100).Я хочу, чтобы результат был: 1 2 3 4 5 6 7 8 9 10 .... и так далее.то есть они должны выполняться один за другим по порядку. </p>

Вот код для этого:

class Monitor{
    boolean flag = false;
}

class OddNumberPrinter implements Runnable{
    Monitor monitor;
    OddNumberPrinter(Monitor monitor){
        this.monitor = monitor;
    }

    @Override
    public void run() {
        for (int i = 1; i<100; i+=2){

            synchronized (monitor){
                while(monitor.flag == true){
                    try {
                        wait();
                    } catch (Exception e) {}
                }
                System.out.print(i+"  ");
                monitor.flag = true;
                notify();
            }
        }
    }
}
class EvenNumberPrinter implements Runnable{
    Monitor monitor;
    EvenNumberPrinter(Monitor monitor){
        this.monitor = monitor;
    }

    @Override
    public void run() {
        for (int i = 2; i<101; i+=2){
            synchronized (monitor){
                while (monitor.flag == false){
                    try {
                        wait();
                    } catch (Exception e) {}
                }
                System.out.print(i + "  ");
                monitor.flag = false;
                notify();
            }
        }
    }
}
public class InterleavingThreads {

    public static void main(String[] args) throws InterruptedException {
        Monitor monitor = new Monitor();
        Thread t1 = new Thread(new OddNumberPrinter(monitor));
        Thread t2 = new Thread(new EvenNumberPrinter(monitor));

        t1.start();
       t2.start();
    }
}

Когда я в автономном режиме использую wait () и notify () ,он генерирует исключение, но использование monitor.wait () и monitor.notify () дает правильный вывод.Пожалуйста, объясните разницу в этих двух.

...