Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
 Аватар для robotcode
28 / 8 / 6
Регистрация: 20.09.2017
Сообщений: 133

Поставщик-потребитель

09.03.2018, 21:12. Показов 2485. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть код, который читает текстовый файл и делает транслит в латиницу.
Пытаюсь решить задачу через "поставщик-потребитель" (поток1 (поставщик) - читает текст построчно и помещает строки в буфер; поток2 (потребитель) - выполняет транслит. Буфер ограничен (5 строк))

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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
try {
            BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("C:\\Users\\text.txt")));
            String line = null;
 
            StringBuilder sb = new StringBuilder();
 
            while ((line = br.readLine()) != null) {
 
                sb.append(line).append("\n");
            }
            br.close();
 
            String str = sb.toString().replace("А", "A");
            str = str.replace("Б", "B");
            str = str.replace("В", "V");
            str = str.replace("Г", "G");
            str = str.replace("Д", "D");
            str = str.replace("Е", "E");
            str = str.replace("Ё", "E");
            str = str.replace("Ж", "Zh");
            str = str.replace("З", "Z");
            str = str.replace("И", "I");
            str = str.replace("Й", "I");
            str = str.replace("К", "K");
            str = str.replace("Л", "L");
            str = str.replace("М", "M");
            str = str.replace("Н", "N");
            str = str.replace("О", "O");
            str = str.replace("П", "P");
            str = str.replace("Р", "R");
            str = str.replace("С", "S");
            str = str.replace("Т", "T");
            str = str.replace("У", "U");
            str = str.replace("Ф", "F");
            str = str.replace("Х", "Kh");
            str = str.replace("Ц", "C");
            str = str.replace("Ч", "Ch");
            str = str.replace("Ш", "Sh");
            str = str.replace("Щ", "Sch");
            str = str.replace("Ъ", "'");
            str = str.replace("Ы", "Y");
            str = str.replace("Ъ", "'");
            str = str.replace("Э", "E");
            str = str.replace("Ю", "Yu");
            str = str.replace("Я", "Ya");
            str = str.replace("а", "a");
            str = str.replace("б", "b");
            str = str.replace("в", "v");
            str = str.replace("г", "g");
            str = str.replace("д", "d");
            str = str.replace("е", "e");
            str = str.replace("ё", "e");
            str = str.replace("ж", "zh");
            str = str.replace("з", "z");
            str = str.replace("и", "i");
            str = str.replace("й", "i");
            str = str.replace("к", "k");
            str = str.replace("л", "l");
            str = str.replace("м", "m");
            str = str.replace("н", "n");
            str = str.replace("о", "o");
            str = str.replace("п", "p");
            str = str.replace("р", "r");
            str = str.replace("с", "s");
            str = str.replace("т", "t");
            str = str.replace("у", "u");
            str = str.replace("ф", "f");
            str = str.replace("х", "h");
            str = str.replace("ц", "c");
            str = str.replace("ч", "ch");
            str = str.replace("ш", "sh");
            str = str.replace("щ", "sch");
            str = str.replace("ъ", "'");
            str = str.replace("ы", "y");
            str = str.replace("ъ", "'");
            str = str.replace("э", "e");
            str = str.replace("ю", "yu");
            str = str.replace("я", "ya");
 
            System.out.println(str);
 
        } catch (FileNotFoundException e) {
            System.out.println(e.getMessage());
        } catch (IOException e) {
            System.out.println(e.getMessage());
        }
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.03.2018, 21:12
Ответы с готовыми решениями:

Потребитель- производитель
Помогите пожалуйста в написании программы под ubuntu 11.04 сама задача(описание): http://sdmitri.ru/Erzeuger-Verbraucher-Problem

Производитель потребитель
Задание: написать программу, в которой реализуется следующее: запись рандомного числа в массив, получение данного числа из массива и...

Программа производитель/потребитель
По книге Джонсон М. Харт "Системное программирование в среде Windows" есть пример этой программы, но он написан на C. Возникла проблема...

9
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
09.03.2018, 21:21
и че?
0
09.03.2018, 21:27

Не по теме:

Никогда не видел настолько бестолкового использования StringBuilder'а.

0
 Аватар для robotcode
28 / 8 / 6
Регистрация: 20.09.2017
Сообщений: 133
09.03.2018, 21:44  [ТС]
Цитата Сообщение от korvin_ Посмотреть сообщение
Никогда не видел настолько бестолкового использования StringBuilder'а.
Лучше плохой код, чем никакой.
0
09.03.2018, 22:01

Не по теме:

Цитата Сообщение от robotcode Посмотреть сообщение
Лучше плохой код, чем никакой.
Лучше нормальный код, чем чёрти что.

0
 Аватар для robotcode
28 / 8 / 6
Регистрация: 20.09.2017
Сообщений: 133
09.03.2018, 22:07  [ТС]
Цитата Сообщение от korvin_ Посмотреть сообщение
Лучше нормальный код, чем чёрти что.
У меня как минимум работает - так что уже есть с чем работать. Да и Java изучаю 2-й месяц
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2774 / 491
Регистрация: 28.04.2012
Сообщений: 8,779
09.03.2018, 22:20
Цитата Сообщение от robotcode Посмотреть сообщение
Да и Java изучаю 2-й месяц
ОМГ, за два месяца можно было уже прочитать “Effective Java” и “Clean Code”.
1
 Аватар для robotcode
28 / 8 / 6
Регистрация: 20.09.2017
Сообщений: 133
10.03.2018, 12:05  [ТС]
korvin_, мне ещё не советовали этих книг, почитаю на досуге

Добавлено через 13 часов 31 минуту
Можно ли переделать код, чтоб он отдавал в поток CONSUMER не сразу весь текст, а кусками (например по 5 строк) ?
И, конечно, интересны общие замечания по коду

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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
public class Main {
 
    public static void main(String[] args) {
 
        final SynchronousQueue<StringBuilder> queue = new SynchronousQueue<>();
 
        Thread producer = new Thread("PRODUCER") {
            public void run() {
                System.out.println("Работает поток PRODUCER");
 
                try {
                    BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("C:\\text.txt")));
             
                    String line = null;
 
                    StringBuilder sb = new StringBuilder();
 
                    while ((line = br.readLine()) != null) {
 
                        sb.append(line).append("\n");
                 
                    }
                    br.close();
 
                    queue.put(sb); // thread will block here
 
                } catch (FileNotFoundException e) {
                    System.out.println(e.getMessage());
                } catch (IOException e) {
                    System.out.println(e.getMessage());
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
 
            }
 
        };
 
        producer.start(); // starting publisher thread
 
        Thread consumer = new Thread("CONSUMER") {
            public void run() {
                System.out.println("Работает поток CONSUMER");
                try {
                    StringBuilder sb = queue.take(); // thread will block here
 
                    String str = sb.toString().replace("А", "A");
                    str = str.replace("Б", "B");
                    str = str.replace("В", "V");
                    str = str.replace("Г", "G");
                    str = str.replace("Д", "D");
                    str = str.replace("Е", "E");
                    str = str.replace("Ё", "E");
                    str = str.replace("Ж", "Zh");
                    str = str.replace("З", "Z");
                    str = str.replace("И", "I");
                    str = str.replace("Й", "I");
                    str = str.replace("К", "K");
                    str = str.replace("Л", "L");
                    str = str.replace("М", "M");
                    str = str.replace("Н", "N");
                    str = str.replace("О", "O");
                    str = str.replace("П", "P");
                    str = str.replace("Р", "R");
                    str = str.replace("С", "S");
                    str = str.replace("Т", "T");
                    str = str.replace("У", "U");
                    str = str.replace("Ф", "F");
                    str = str.replace("Х", "Kh");
                    str = str.replace("Ц", "C");
                    str = str.replace("Ч", "Ch");
                    str = str.replace("Ш", "Sh");
                    str = str.replace("Щ", "Sch");
                    str = str.replace("Ъ", "'");
                    str = str.replace("Ы", "Y");
                    str = str.replace("Ъ", "'");
                    str = str.replace("Э", "E");
                    str = str.replace("Ю", "Yu");
                    str = str.replace("Я", "Ya");
                    str = str.replace("а", "a");
                    str = str.replace("б", "b");
                    str = str.replace("в", "v");
                    str = str.replace("г", "g");
                    str = str.replace("д", "d");
                    str = str.replace("е", "e");
                    str = str.replace("ё", "e");
                    str = str.replace("ж", "zh");
                    str = str.replace("з", "z");
                    str = str.replace("и", "i");
                    str = str.replace("й", "i");
                    str = str.replace("к", "k");
                    str = str.replace("л", "l");
                    str = str.replace("м", "m");
                    str = str.replace("н", "n");
                    str = str.replace("о", "o");
                    str = str.replace("п", "p");
                    str = str.replace("р", "r");
                    str = str.replace("с", "s");
                    str = str.replace("т", "t");
                    str = str.replace("у", "u");
                    str = str.replace("ф", "f");
                    str = str.replace("х", "h");
                    str = str.replace("ц", "c");
                    str = str.replace("ч", "ch");
                    str = str.replace("ш", "sh");
                    str = str.replace("щ", "sch");
                    str = str.replace("ъ", "'");
                    str = str.replace("ы", "y");
                    str = str.replace("ъ", "'");
                    str = str.replace("э", "e");
                    str = str.replace("ю", "yu");
                    str = str.replace("я", "ya");
 
                    System.out.println(str);
 
 
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        };
 
        consumer.start(); // starting consumer thread
 
    }
}
0
10.03.2018, 21:32
 Комментарий модератора 
Друзья, меньше негатива! И тем более без перехода на личности! Помним формулу "Критикуешь - предлагай!"
0
25 / 26 / 9
Регистрация: 14.03.2018
Сообщений: 74
15.03.2018, 08:42
Лучший ответ Сообщение было отмечено robotcode как решение

Решение

Цитата Сообщение от korvin_ Посмотреть сообщение
Никогда не видел настолько бестолкового использования StringBuilder'а.
Без этого бестолкового и негативного замечания тема спокойно бы выжила, вот сто пудов.

Цитата Сообщение от robotcode Посмотреть сообщение
korvin_, мне ещё не советовали этих книг, почитаю на досуге
Не переживай, он не тот человек чьи советы стоит слушать.

Вот твой код. Передает по пять строк, и перекодировщик сделан более компактно, ну да потоки настроены
на кириллицу cp1251, если будут кракозябры, поменяй на UTF-8 название charset.
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
public class Main {
    private static final String[] charSetEn =
            ("A B V G D E E Zh Z I I K L M N O P R S T U F Kh C Ch Sh Sch ' Y ' E Yu Ya " +
                    "a b v g d e e zh z i i k l m n o p r s t u f kh c ch sh  sch ' y ' e yu ya").split(" ");
 
    private static final String[] charSetRu =
            ("А Б В Г Д Е Ё Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Ь Ы Ъ Э Ю Я " +
                    "а б в г д е ё ж з и й к л м н о п р с т у ф х ц ч ш щ ь ы ъ э ю я").split(" ");
 
    public static void main(String[] args) {
 
 
        final SynchronousQueue<StringBuilder> queue = new SynchronousQueue<>();
 
        Thread producer = new Thread("PRODUCER") {
            public void run() {
                System.out.println("Работает поток PRODUCER");
 
                try {
                    Charset charSet = Charset.forName("cp1251");
                    BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("C:\\Temp\\text.txt"),charSet));
 
                    String line = null;
 
                    StringBuilder sb = new StringBuilder();
 
                    int count = 0;
                    while ((line = br.readLine()) != null) {
 
                        sb.append(line).append("\n");
                        count++;
                        if (count % 5 == 0) {
                            queue.put(sb);
                            sb = new StringBuilder();
                        }
                    }
                    br.close();
                    queue.put(sb); // thread will block here
                    sb = new StringBuilder();
                    queue.put(sb);
 
 
                } catch (IOException e) {
                    System.out.println(e.getMessage());
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
 
            }
 
        };
 
        producer.start(); // starting publisher thread
 
        Thread consumer = new Thread("CONSUMER") {
            public void run() {
                System.out.println("Работает поток CONSUMER");
                try {
                    boolean isFinished = false;
                    while (!isFinished || !queue.isEmpty()) {
                        StringBuilder sb = queue.take(); // thread will block here
                        isFinished = sb.toString().isEmpty();
 
 
                        String str = sb.toString();
                        for (int i = 0; i < charSetRu.length; i++) {
                           str =  str.replaceAll(charSetRu[i],charSetEn[i]);
                        }
 
                        System.out.println(str);
                    }
 
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        };
 
        consumer.start(); // starting consumer thread
 
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.03.2018, 08:42
Помогаю со студенческими работами здесь

C++11 thread производитель-потребитель
Реализовал схему производитель-потребитель. Есть класс генератора последовательных целых чисел, ограниченных максимальным занчением, на...

Источник/потребитель тока - как?
Здравствуйте! Дело такое: нужно сделать управляемую нагрузку (чтобы с заданным током разряжала аккумулятор), и источник тока (чтобы...

Задача многопоточной реализации потребитель-покупатель
Реализация задачи «поставщик-потребитель». Требуется реализовать приложение- поставщик и приложение-потребитель или многопоточное...

Мощность, котокую получит от подстанции потребитель
От подстанции к потребителю передается мощность P1=62 квт,Электопередача осуществляется при напряжении U1=6200 B. Мощность P2, которую...

Производитель-Потребитель c собственным Монитором на мьютексах
Доброго времени суток! Решил значит изучить и разобраться в теме многопоточности и синхронизации процессов. В качестве очередного...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
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 19.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
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru