Java Синхронизация потоков 101 - PullRequest
0 голосов
/ 30 апреля 2020

Считая, что общий объект Control заставит n потоки (Number) отображать по порядку, они явно не:

Number:

public class Number implements Runnable {

    private int i_;
    private Control control;

    public Number(int i, Control c) {
        i_ = i;
        control = c;
    }

    public void start() {
        new Thread(this).start();
    }

    public void run() {
        synchronized(control) {
            control.call(i_);
        }
    }
}

Control :

public class Control {

    private int i_ = 0;

    public void call(int i) {

        if(i != i_) {
            try {
                wait();
            }
            catch(Exception e) {}
        }

        System.out.println(i);
        i_++; // next, please                                                                                                                                                                                   
        notify();
    }
}

Испытательный жгут (основной):

public class RunNumbers {

    public static void main(String args[]) {

        int n = 0;
        if (args.length > 0) {
            n = Integer.parseInt(args[0]);
        }

        Control c = new Control();
        for(int i = 0; i < n; ++i) {
            new Number(i, c).start();
        }
    }
}

Есть идеи?

1 Ответ

0 голосов
/ 02 мая 2020

Вышесказанное было достигнуто путем объединения нескольких учебных пособий, включающих только пару потоков (без реального знания того, что происходит), что привело к невозможности масштабирования всего до более чем двух потоков.

После более подробного исследования вышеприведенное можно исправить, изменив 2 строки в Control.java:

(a), измените if(i != i_) { на while(i != i_) {

(b), измените notify(); до notifyAll();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...