1 / 1 / 1
Регистрация: 13.04.2015
Сообщений: 31
1

Ошибка при синхронизации потоков. (Задача написать писателя-читателя)

03.07.2016, 21:49. Показов 1957. Ответов 3

Студворк — интернет-сервис помощи студентам
Здравствуйте, уважаемые программисты. Есть задача написать программу писатель-читатель. Должно быть три писателя и один читатель, писатель пишет, передает управление читателям, которые считывают буфер, после этого писатель опять пишет в буфер. Самого писателя-читателя я написал, но вот с синхронизацией возникли проблемы. Привожу код программы. Помогите, пожалуйста, правильно синхронизировать потоки. Заранее большое спасибо.
1) Синхронизацию записи/чтения реализовать с помощью классической блокирующей синхронизации (synchronized). Замечание: из исходного кода ничего не удалять, код только добавлять или переставлять местами строки кода. Возможно потребуется несколько мониторов. Не добавлять код, который содержит вызов метода Thread#join. Программа должна быть устойчивой к изменению констант - количество тактов чтения/записи; размер буфера; задержка при записи/чтении, т.е. после изменения данных параметров приложение должно работать правильно. Для проверки можно написать класс, в котором многократно вызывать Part51.main (например, 50 раз; в конечный код данную функциональность не включать!).
2) Синхронизацию записи/чтения реализовать с помощью объекта ReentranLock. Для синхронизации читателей использовать объект Condition, который связан с объектом ReentranLock.
3) То же, что и способ 2, но не использовать Condition.
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
127
**
 * Note!!! Without synchronization this application not work properly!! Most
 * likely a runtime exception will be thrown..
 * 
 */
public class Part51 {
 
    private static final int ITERATION_NUMBER = 3;
 
    private static final int READERS_NUMBER = 3;
 
    // shared resource (not thread-safe!!!)
    private static final StringBuffer BUFFER = new StringBuffer();
 
    private static final int BUFFER_LENGTH = 5;
 
    // speed parameter
    private static final int PAUSE = 5;
 
    // stop signal
    private static boolean stop;
 
    
 
    // reader
    private static class Reader extends Thread {
        public void run() {
            while (!stop) {
 
                try {
 
                    // read from the buffer
                    read(getName());
 
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
 
    // writer
    private static class Writer extends Thread {
        public void run() {
            int tact = 0;
            while (!stop) {
                try {
 
                    // write to the buffer
                    write();
 
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    if (++tact == ITERATION_NUMBER) {
                        stop = true;
                    }
                }
            }
        }
    }
 
    private static void read(String threadName) throws InterruptedException {
        
        System.out.printf("Reader %s:", threadName);
        for (int j = 0; j < BUFFER_LENGTH; j++) {
            Thread.sleep(PAUSE);
            System.out.print(BUFFER.charAt(j));
        }
        System.out.println();
 
        Thread.sleep(5);
        
    }
 
    private static void write() throws InterruptedException {
 
        // write to buffer
        
        BUFFER.setLength(0);
 
        System.err.print("Writer writes:");
 
        Random random = new Random();
        for (int j = 0; j < BUFFER_LENGTH; j++) {
            Thread.sleep(PAUSE);
            char ch = (char) ('A' + random.nextInt(26));
            System.err.print(ch);
            BUFFER.append(ch);
 
        }
        System.err.println();
 
        Thread.sleep(5);
        
    }
 
    public static void main(String[] args) throws InterruptedException {
        // create writer
        Writer writer = new Writer();
        
 
        // create readers
        List<Thread> readers = new ArrayList<>();
        for (int j = 0; j < READERS_NUMBER; j++) {
            readers.add(new Reader());
        }
 
        // start readers
        Thread.sleep(10);
        for (Thread reader : readers) {
            reader.start();
        }
        
 
        // start writer
        writer.start();
        Thread.sleep(10);
 
        // main thread is waiting for the child threads
        writer.join();
        for (Thread reader : readers) {
            reader.join();
        }
    }
 
}
Добавлено через 6 часов 25 минут
Неужели никто не поможет?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.07.2016, 21:49
Ответы с готовыми решениями:

Задача "читателя и писателя" с буферным пулом (динамическим массивом)
Сама задача: Рассмотрим взаимодействие двух потоков, один из которых пишет данные в буферный пул,...

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

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

Есть ли ошибка в синхронизации доступа к переменной из нескольких потоков?
Безопасно ли читать из переменной вот так? Ведь она не volatile. В книге CLR Via C# есть пример с...

3
Эксперт Java
3638 / 2970 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
05.07.2016, 13:57 2
погугли blockingQueue
вот тут, например, посмотри
0
Эксперт Java
4090 / 3824 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 11
05.07.2016, 21:48 3
Alex-Borshch, Так вам какой вариант нужен? Все три?

Добавлено через 58 секунд
PS. Вы бы показали ваши потуги. Так бы дело быстрее пошло
0
1 / 1 / 1
Регистрация: 13.04.2015
Сообщений: 31
05.07.2016, 23:46  [ТС] 4
Мне хотя бы с synchronized сделать, надеюсь потом разберусь с остальными буду дома, скину свои потуги
0
05.07.2016, 23:46
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.07.2016, 23:46
Помогаю со студенческими работами здесь

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

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

Пример синхронизации потоков из учебника
Здравствуйте! Я - новичок, поэтому заранее извиняюсь за возможно детский вопрос. Приведу вначале...

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

Как реализовать рекурсию в синхронизации потоков
Здравствуйте.Объясните чайнику как реализовать рекурсию в синхронизации потоков(сам софт...

Средства синхронизации потоков. Длительное ожидание
Здравствуйте. Сперва опишу абстрактную суть задачи: есть сервис который работает с объектами...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru