Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
 Аватар для Maxim09
1 / 1 / 4
Регистрация: 23.08.2015
Сообщений: 458

Синхронизация метода(пример из книги Г. Шилдт)очерёдность вывода результата не такая как в главном потоке

31.08.2017, 11:35. Показов 1051. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет (сори за длинное название темы но не знал как иначе передать суть вопроса).
В книге "Шилдт Г. - Java 8. Полное руководство. 9-е издание (2015)" есть пример программы реализующей синхронизацию метода для нескольких потоков (стр 301) результат выполнения этой программы не такой как в книге, я понимаю что среды разработки разные(пишу на NetBeans) и т.д. НО почему выполняется не по порядку? Т.е.:
Выдаёт такой результат:
[Добро пожаловать]
[мир!]
[в синхронизированный]

А должно наоборот:
[Добро пожаловать]
[в синхронизированный]
[мир!]


Я также проверил приоритеты(подумал что они разные но нет)
Вот я и задаюсь вопросом ПОЧЕМУ 'obj3' "печатается" раньше чем 'obj2' ведь по идее они должны работать по очереди установленной в главном потоке(написанной в main ф-ции).
Если запустить раз 20 то может 2-3 раза и сработает так как надо.

P.s. если поменять obj2 и obj3 местами:
Caller obj3 = new Caller(target, "мир!");
Caller obj2 = new Caller(target, "в синхронизированный");

То всё срабатывает должным образом!

Поясните мне из за чего это происходит?

Вот сам пример:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
class Callme {
 
    synchronized void call(String msg) {
        System.out.print("[" + msg);
        try {
            Thread.sleep(1000);
        } catch (InterruptedException ex) {
            System.out.println("Прервано");
        }
        System.out.println("]");
    }
}
 
class Caller implements Runnable {
 
    String msg;
    Callme target;
    Thread t = new Thread();
 
    Caller() {
    }
 
    public Caller(Callme targ, String s) {
        target = targ;
        msg = s;
        t = new Thread(this);
        t.start();
    }
 
    public void run() {
        target.call(msg);
    }
}
 
public class Synch {
 
    public static void main(String[] args) {
        Callme target = new Callme();
 
        Caller obj1 = new Caller(target, "Добро пожаловать");
 
        Caller obj2 = new Caller(target, "в синхронизированный");
 
        Caller obj3 = new Caller(target, "мир!");
        
        try {
            obj1.t.join();
            obj2.t.join();
            obj3.t.join();
        } catch (InterruptedException е) {
            System.out.println("Прервано");
        }
    }
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
31.08.2017, 11:35
Ответы с готовыми решениями:

Не пойму как запустить пример из книги C# 4.0 Шилдт
/* Копировать файл. Чтобы воспользоваться этой программой, укажите имена исходного и выходного файлов. Например, для...

Пример из книги. Шилдт
Всем привет. Вот пример из книги Шилдта. У меня не работает деструктор (не выводится сообщение) #include <iostream> using...

Пример из книги Герберт Шилдт
Пример: Пример использования объединения для побайтного вывода значения типа double в двоичном представлении У меня вопрос не к...

1
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2774 / 491
Регистрация: 28.04.2012
Сообщений: 8,779
31.08.2017, 18:50
Цитата Сообщение от Maxim09 Посмотреть сообщение
я понимаю что среды разработки разные(пишу на NetBeans)
Это не имеет никакого значения.

Цитата Сообщение от Maxim09 Посмотреть сообщение
Java
1
2
3
Thread t = new Thread();
...
t = new Thread(this);
Зачем ты создаёшь два треда? Зачем ты создаёшь тред внутри Runnable? Передавать this в конструкторе куда-либо — плохая практика. И вообще, выкинь Шилдта.

Цитата Сообщение от Maxim09 Посмотреть сообщение
ведь по идее они должны работать по очереди установленной в главном потоке(написанной в main ф-ции).
Нет такой идеи. Они свободны работать «как попало», никакой очереди выполнения в main не задаётся в этом примере. Либо дальше в книге всё объясняется, либо выкинь книгу.
4
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
31.08.2017, 18:50
Помогаю со студенческими работами здесь

пример из книги Шилдт С++ базовый курс - непонятно
На стр 72 приведен пример // эта программа демонстрирует использование ф-и xor() #include <iostream> using namespace std; ...

Способ вызова из фонового потока метода, но чтобы последний выполнялся в главном потоке
Есть два потока: главный и фоновый. Ищу способ вызова из фонового потока метода, но чтобы последний выполнялся в главном потоке. ...

Многопоточность.Не работает пример из книги "Руководство для начинающих. Шилдт" стр 413-414
Добрый день! Укажите пожалуйста проблему данного кода. Пример демонстрирует применение двух поток, выполняющихся с разными...

Как вызвать метод в главном потоке?
Как вызвать метод в главном потоке? Например у меня по таймеру запускается AudioSource, но просит вызвать его в главном потоке. Можно...

Как запустить метод в главном потоке из не главного потока?
Прив. У меня такая трабла, пишу клиент, для игры на одном движке, и если от сервера пришла какая-то определенная инфа, то мне необходимо...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru