Я изучаю Java по книге Герберта Шилдта «Java The Complete Reference Tenth Edition». Я работаю над программой Java с несколькими потоками и ожидаю, что выходные данные будут в определенном порядке, но получаю разные результаты. Я использую синхронизированный метод для управления доступом к общим ресурсам, но порядок вывода не такой, как я ожидал.
Код:
Код: Выделить всё
class Callme {
synchronized void call(String msg) {
System.out.print("[" + msg);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
System.out.println("Interrupted");
}
System.out.println("]");
}
}
class Caller implements Runnable {
String msg;
Callme target;
Thread t;
public Caller(Callme targ, String s) {
target = targ;
msg = s;
t = new Thread(this);
}
public void run() {
target.call(msg);
}
}
class Synch {
public static void main(String[] args) {
Callme target = new Callme();
Caller hello = new Caller(target, "Hello");
Caller synch = new Caller(target, "Synchronized");
Caller world = new Caller(target, "World");
hello.t.start();
synch.t.start();
world.t.start();
try {
hello.t.join();
synch.t.join();
world.t.join();
} catch (InterruptedException e) {
System.out.println("Interrupted");
}
}
}
Код: Выделить всё
[Hello] [Synchronized] [World]
Код: Выделить всё
[Hello] [World] [Synchronized]
Может ли кто-нибудь объяснить, почему я наблюдаю такое поведение? Есть ли что-то, что мне не хватает при синхронизации потоков, что влияет на порядок выполнения?
Что я пробовал:
Я пытался изменить порядок вызовов start() и join(), но проблема остается. Я также пытался создать поток, используя наследование потоков вместо реализации Runnable.
Подробнее здесь: https://stackoverflow.com/questions/791 ... -multithre