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

Пример из книги Шилда неправильно работает

15.01.2018, 22:06. Показов 931. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго дня разбираю книгу
Java8 полное руководство 9-е издание Герберта Шилда
на 303 странице есть код примера синхронизации потоков. Немного не правильно работает.
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
public class CallMy {
    synchronized void Call(String msg) {
        System.out.print("[" + msg);
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            System.out.println("Поток прерван :");
        }
        System.out.print("]");
    }
}
class Caller implements Runnable{
    String msg;
    CallMy target;
    Thread t;
    
    public Caller(String msg, CallMy target) {
        this.msg = msg;
        this.target = target;
        t=new Thread(this);
        t.start();
    }
 
    @Override
    public void run() {
        target.Call(msg);
    }
}
class Synch{
    public static void main(String args[]) {
        CallMy target=new CallMy();
        Caller ob1=new Caller("Добро пожаловать ", target);
        Caller ob2=new Caller("в синхронизированный ", target);
        Caller ob3=new Caller("мир", target);
        try {
            ob1.t.join();
            ob2.t.join();
            ob3.t.join();
        } catch (InterruptedException e) {
            System.out.println("Поток прерван :");
        }
    }
}
Дает такой результат
[Добро пожаловать ][мир][в синхронизированный ]
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.01.2018, 22:06
Ответы с готовыми решениями:

Synchronized. Не работает пример из книги Шилдта «Java. Полное руководство»
Я нашёл ошибку в книге Герберта Шилдта «Java. Полное руководство». Это не задача из книги. Это опячатка. Там при описании синхронизации...

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

Не работает программа из Книги Шилда)
Привет,СyberForum,и пользователи) Читаю книгу Шилдт Г. С++ Базовый курс (3-е издание, 2010) По чуть чуть не торопясь,но перепробывая...

3
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,780
16.01.2018, 00:00
Цитата Сообщение от Alex_Fedor Посмотреть сообщение
Немного не правильно работает.
Пример работает правильно. Просто г-н Шилдн примеры пишет неправильные. Лучше не читай его.

В разделе литературы есть примеры более годных книг.

Добавлено через 25 минут
Цитата Сообщение от korvin_ Посмотреть сообщение
Просто г-н Шилдн примеры пишет неправильные
Либо объясняет их неправильно. Какой там сопроводительный текст?

Перепишем этот пример по-нормальному, заодно избавившись от мусора:

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
import java.io.PrintStream;
 
public final class Printer {
 
    private final PrintStream out;
 
    public Printer(PrintStream out) {
        this.out = out;
    }
 
    public synchronized void print(String message) {
        out.print("[" + message);
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
            Thread.currentThread().interrupt();
        }
        out.print("]");
    }
}
 
final class Sync {
 
    public static void main(String[] args) {
        final Printer p = new Printer(System.out);
        printInThread(p, "Welcome");
        printInThread(p, "to a synchronized");
        printInThread(p, "world");
    }
 
    private static void printInThread(Printer p, String message) {
        new Thread(() -> p.print(message)).start();
    }
}
=>
Code
1
[Welcome][world][to a synchronized]
Теперь уберём synchronized из Printer.print(String) и получим:
Code
1
[to a synchronized[world[Welcome]]]
Чувствуешь разницу?

Добавлено через 16 минут
Сделаем чуть поинтересней:

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
55
56
import java.io.PrintStream;
import java.util.concurrent.ThreadLocalRandom;
 
public final class Printer {
 
    private final PrintStream out;
 
    public Printer(PrintStream out) {
        this.out = out;
    }
 
    public void print(String message) {
        try {
            Thread.sleep(ThreadLocalRandom.current().nextLong(200));
            printSync(message);
        } catch (InterruptedException e) {
            e.printStackTrace();
            Thread.currentThread().interrupt();
        }
    }
 
    private synchronized void printSync(String message) throws InterruptedException {
        out.print(" [ " + message);
        Thread.sleep(100);
        out.print(" ] ");
    }
}
 
final class Sync {
 
    public static void main(String[] args) throws InterruptedException {
        for (int i = 0; i < 5; i++) {
            test(i+1, System.out);
        }
    }
 
    private static void test(int i, PrintStream out) throws InterruptedException {
        out.print(i + ". ");
        final Printer p = new Printer(out);
        final Thread[] threads = new Thread[]{
                printInThread(p, "Welcome"),
                printInThread(p, "to a synchronized"),
                printInThread(p, "world")
        };
        for (final Thread t : threads) {
            t.join(1000);
        }
        out.println();
    }
 
    private static Thread printInThread(Printer p, String message) {
        final Thread t = new Thread(() -> p.print(message));
        t.start();
        return t;
    }
}
=>
Code
1
2
3
4
5
1.  [ world ]  [ Welcome ]  [ to a synchronized ] 
2.  [ world ]  [ to a synchronized ]  [ Welcome ] 
3.  [ to a synchronized ]  [ Welcome ]  [ world ] 
4.  [ to a synchronized ]  [ Welcome ]  [ world ] 
5.  [ to a synchronized ]  [ world ]  [ Welcome ]
Теперь уберём synchronized из Printer.printSync(String) и получим:
Code
1
2
3
4
5
1.  [ to a synchronized [ world ]  [ Welcome ]  ] 
2.  [ to a synchronized [ world ]  [ Welcome ]  ] 
3.  [ world [ to a synchronized [ Welcome ]  ]  ] 
4.  [ to a synchronized [ Welcome [ world ]  ]  ] 
5.  [ Welcome [ world ]  ]  [ to a synchronized ]
Alex_Fedor, теперь понимаешь, в чём соль?
1
42 / 42 / 5
Регистрация: 20.01.2015
Сообщений: 279
16.01.2018, 08:03  [ТС]
Цитата Сообщение от korvin_ Посмотреть сообщение
теперь понимаешь, в чём соль?
Спасибо за ответ, но в чем соль так и не почувствовал. Ваш пример, выдает
[Welcome][world][to a synchronized]
Хотя вроде по идее должно быть
[Welcome][to a synchronized][world]
По большому счету вопрос в следующем. Имеем несколько потоков, необходимо гарантированно запустить первым 1поток, вторым 2поток, третьим 3поток и тд. А в этих кодах запускаются потоки первый, третий, второй.
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,780
16.01.2018, 11:15
Цитата Сообщение от Alex_Fedor Посмотреть сообщение
Хотя вроде по идее должно быть
Не должен быть.

Цитата Сообщение от Alex_Fedor Посмотреть сообщение
По большому счету вопрос в следующем. Имеем несколько потоков, необходимо гарантированно запустить первым 1поток, вторым 2поток, третьим 3поток
Пример не про это.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.01.2018, 11:15
Помогаю со студенческими работами здесь

Пример по Г.Шилда
Занимаюсь по книге Г.Шилда и там пример такой: using System; class Example { public static void Main() { int val...

Пример с книги не работает
первый же пример с книги по вебгл не работает &lt;!DOCTYPE html&gt; &lt;html lang=“en&quot;&gt; &lt;head&gt; &lt;meta charset=&quot;utf-8&quot; /&gt; ...

Не работает пример из книги
using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Drawing; using...

Пример из книги не работает
Книга Радченко М.Г., Хрусталева Е.Ю. 1С Предприятие 8.2. Практическое пособие разработчика (2009) &quot;Автоматическая подстановка цены в...

Пример из книги не работает.
Пример из книги, тема Классы но смотрю что нет обращения к Task::swap(int i,int j) Думаю ошибка именно в Task::sort(int size). ...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
Программный отбор значений справочника
Maks 21.03.2026
Установка программного отбора значений справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru