С Новым годом! Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/9: Рейтинг темы: голосов - 9, средняя оценка - 5.00
5 / 5 / 1
Регистрация: 20.11.2012
Сообщений: 50
1

Пример синхронизации потоков из учебника

10.09.2015, 21:20. Показов 1801. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте! Я - новичок, поэтому заранее извиняюсь за возможно детский вопрос. Приведу вначале листинг кода из учебника Шилдта, который сейчас разбираю:

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
    class Callme {
        void call (String msg) {
            System.out.print("["+msg);
            try {
                Thread.sleep(1000);         
            } catch (InterruptedException e) {
                System.out.println("Поток Callme прерван.");
            }
            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);
            t.start();
        }
        
        public void run() {
            synchronized(target) {
                target.call(msg);
            }
        }
    }
     
    public class Synch {
     
        public static void main(String[] args) {
            Callme target = new Callme();
            Caller ob1 = new Caller(target, "Добро пожаловать");
            Caller ob2 = new Caller(target, "в синхронизированный");
            Caller ob3 = new Caller(target, "мир!");
            Caller ob4 = new Caller(target, "******");
            try {
                ob1.t.join();
                ob2.t.join();
                ob3.t.join();
                ob4.t.join();
            } catch (InterruptedException e) {
                System.out.println("Главный поток прерван.");
            }
     
        }
     
    }
Проблема в следующем: вся эта синхронизация, как оказывается, до фонарика. Ну как, до фонарика, посреди выполнения одного потока другой поток не вклинивается, конечно, но сами потоки почему-то перепутаны дивным образом: сначала выводит свою строку ob1, потом почему-то ob4, ob3 и ob2. Т.е. вывод в консоль выглядит таким образом:

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

а должно быть по замыслу

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

Вот интересно мне, в чем может быть проблема?

P.S. OS - Ubuntu 14.04.3, IDE - Eclipse MARS.

 Комментарий модератора 
5.2 Запрещено использовать нецензурные выражения в любом виде
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.09.2015, 21:20
Ответы с готовыми решениями:

Задача синхронизации потоков. Потокобезопасный инкремент
Помогите решить задачу по синхронизации потоков. Никак не могу разобраться. Есть класс со...

Пример из учебника
Добрый вечер! Пишу пример: class Box { double width; double height; double depth; //метод...

Задача о синхронизации потоков только методами wait и notify
Привет всем! Я не могу понять почему мой код не работает. задание: 4.Создать...

Ошибка при синхронизации потоков. (Задача написать писателя-читателя)
Здравствуйте, уважаемые программисты. Есть задача написать программу писатель-читатель. Должно быть...

7
2884 / 2296 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
10.09.2015, 21:30 2
Выполнение нескольких потоков
0
5 / 5 / 1
Регистрация: 20.11.2012
Сообщений: 50
10.09.2015, 21:32  [ТС] 3
Прочитал в соседней ветке о потоках такую мысль:

приоритет потокам задает ОС. Вы на этот процесс повлиять не можете. Никто не гарантирует что каждый поток будет получать процессорное время строго один за другим.
Это и есть ответ на мой вопрос? То есть, последовательность создания объектов потоков на очередность их выполнения не влияет?

И еще хотел спросить вот что: встречал такое мнение, что вызов start() прямо в конструкторе объекта не есть comme il faut. Хотелось бы понять, почему? Если я, например, напишу отдельный метод launchThread и в main() просто добавлю еще строки вызова его после конструктора, то что от этого изменится в лучшую сторону?
0
Эксперт Java
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
10.09.2015, 21:32 4
deGeneral, порядок выполнения потоков не гарантирован т.к этим занимается ОС
1
5 / 5 / 1
Регистрация: 20.11.2012
Сообщений: 50
10.09.2015, 21:33  [ТС] 5
Да, спасибо. По запуску потока из конструктора не просветите ли?
0
Эксперт Java
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
10.09.2015, 21:35 6
Цитата Сообщение от deGeneral Посмотреть сообщение
По запуску потока из конструктора не просветите ли?
Если вы в процессе работы потока используете данные того класса который конструируете, это нехорошо т.к класс ещё не до конца создан. Если создаваемый класс не используется, но невижу причины.
1
5 / 5 / 1
Регистрация: 20.11.2012
Сообщений: 50
10.09.2015, 21:42  [ТС] 7
Но это, наверное, если вызвать start() до инициализации каких-то полей?
0
Эксперт Java
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
10.09.2015, 21:44 8
Лучший ответ Сообщение было отмечено deGeneral как решение

Решение

deGeneral, почитайте http://www.ibm.com/developerwo... j-jtp0618/ и погуглите. Нет желания переписывать что уже много раз написанно
0
10.09.2015, 21:44
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.09.2015, 21:44
Помогаю со студенческими работами здесь

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

Проблема синхронизации потоков
Здравствуйте! Нужно показать проблему синхронизации потоков. Помогите пожалуйста. Вот мои...

Простейший случай синхронизации потоков
только изучаю winapi. ситуация наверное банальная, но совсем запутался. например в функции Thread...

Более рациональный способ синхронизации потоков
Вот что делаю я, чтобы дождаться выполнения метода, который вызывается неконтролируемоTask tsk =...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru