Программа Java не выдает ожидаемый результат с помощью синхронизированного метода в многопоточностиJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Программа Java не выдает ожидаемый результат с помощью синхронизированного метода в многопоточности

Сообщение Anonymous »

Проблема:
Я изучаю 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»