06
Дек
2017

Многопоточность в java, почему порядок вывода результата разнится?

Допустим есть такой код. Его результат: [Синхронизация] [в Java] [полезная]. Если объект Caller запускать без отдельного потока (т.е. без extends Thread и без метода start()), то результат будет в другом порядке: [Синхронизация] [полезная] [в Java]. Почему так происходит? Прошу дать развернутый ответ.

class CallMe {
    void call(String msg) {
        System.out.print("[" + msg );
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("]");
    }
}

class Caller extends Thread {
    String msg;
    CallMe target;

    Caller(CallMe target, String msg) {
        this.target = target;
        this.msg = msg;
        start();
    }

    public void run() {
        synchronized (target) {
            target.call(msg);
        }
    }
}

public class Main {
    public static void main(String[] args) {
        CallMe callMe = new CallMe();
        new Caller(callMe, "Синхронизация");
        new Caller(callMe, "в Java");
        new Caller(callMe, " полезная");
    }
}

Источник: https://ru.stackoverflow.com/questions/754797/%D0%9C%D0%BD%D0%BE%D0%B3%D0%BE%D0%BF%D0%BE%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D1%81%D1%82%D1%8C-%D0%B2-java-%D0%BF%D0%BE%D1%87%D0%B5%D0%BC%D1%83-%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BE%D0%BA-%D0%B2%D1%8B%D0%B2%D0%BE%D0%B4%D0%B0-%D1%80%D0%B5%D0%B7%D1%83%D0%BB%D1%8C%D1%82%D0%B0%D1%82%D0%B0-%D1%80%D0%B0%D0%B7%D0%BD%D0%B8%D1%82%D1%81%D1%8F

Тебе может это понравится...

Добавить комментарий