Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
-12 / 0 / 4
Регистрация: 04.10.2014
Сообщений: 272

Взаимная блокировка Java

06.11.2016, 17:31. Показов 684. Ответов 0

Студворк — интернет-сервис помощи студентам
Задание: Разработать программу, которая позволяла бы работать с тремя файлами. Исходная информация должна хранить в файле file1.txt (программа ее считывает и осуществляет с ней преобразования), затем преобразованная информация записывается в файл file2.txt, а в файл file3.txt программа должна записать исходную и преобразованную информацию.Оформить работу программы как работу двух подсистем, которые могут выполняться одновременно.

Реализовал:
FileSystem.java:

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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
import java.io.*;
import java.util.ArrayList;
 
 
//Контейнер для взаимодействия читателя и писателя
public class FileSystem {
 
    //Флаг для Писателя(Писатель не может писать, пока Читатель читает)
    private boolean read;
    //Флаг для Читателя(Читатель не может чиатать, по Писатель пишут)
    private boolean write;
    private File file1;
    private File file2;
    private File file3;
 
    public boolean isRead() {
        return read;
    }
 
    public void setRead(boolean read) {
        this.read = read;
    }
 
    public File getFile1() {
        return file1;
    }
 
    public void setFile1(File file1) {
        this.file1 = file1;
    }
 
    public File getFile2() {
        return file2;
    }
 
    public void setFile2(File file2) {
        this.file2 = file2;
    }
 
    public File getFile3() {
        return file3;
    }
 
    public void setFile3(File file3) {
        this.file3 = file3;
    }
 
    private ArrayList<Flower> arrayList;
 
    public FileSystem() throws IOException {
 
        this.setRead(false);
        this.setFile1(new File("File1.txt"));
        this.setFile2(new File("File2.txt"));
        this.setFile3(new File("File3.txt"));
        this.arrayList = new ArrayList<>();
 
        Flower flower1 = new Flower("Роза","Красная",14);
        Flower flower2 = new Flower("Тюльпан","Желтый",10);
        ArrayList<Flower> inishArrayList = new ArrayList<>();
        inishArrayList.add(flower1);inishArrayList.add(flower2);
        PrintWriter out = new PrintWriter(this.getFile1().getAbsoluteFile());
        for(int i =0; i < inishArrayList.size(); i++)
        {
            out.println(inishArrayList.get(i).getNameFlower());
            out.println(inishArrayList.get(i).getColorFlower());
            out.println(inishArrayList.get(i).getLengthFlower());
        }
        out.close();
 
        //Проверка
        ArrayList<String> Test = new ArrayList<String>();
        try {
            BufferedReader reader = new BufferedReader(new FileReader(this.getFile1()));
            String line;
            while ((line = reader.readLine()) != null) {
                Test.add(line);
            }
        } catch(IOException e) {
            throw new RuntimeException(e);
        }
        System.out.println(Test.size());
        ArrayList<Flower> fw = new ArrayList<Flower>();
        for(int i = 0; i<Test.size();i+=3)
        {
            Flower f = new Flower();
            f.setNameFlower(Test.get(i));
            f.setColorFlower(Test.get(i+1));
            f.setLengthFlower(Integer.parseInt(Test.get(i+2)));
            fw.add(f);
        }
        System.out.println(fw.size());
    }
 
    public synchronized void AddArray(ArrayList<Flower> temp) {
 
        this.arrayList = temp;
 
        //Пока пользователь не считает из массива
        while (this.isRead() != true)
        {
            //Поток спит
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        //Поток просыпается
        notify();
    }
 
 
    public ArrayList<Flower> getArrayList() {
      return this.arrayList;
    }
 
}
 
//Читатель читает из массива и сохраняет в файлы
class Reader implements Runnable{
 
    private FileSystem fileSystem;
    //Флаг для определения, в какой файл будет идти запись
    private int i;
 
    public Reader(FileSystem FS) {
        this.fileSystem = FS;
        this.i =0;
    }
 
    @Override
    public void run() {
        switch (i)
        {
            //Если данные первый раз записываются, то запись идет в 1 файл
            case 0:
            {
                PrintWriter out = null;
                try {
                    out = new PrintWriter(fileSystem.getFile3().getAbsoluteFile());
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                }
                for(int i =0; i < fileSystem.getArrayList().size(); i++)
                {
                    out.println(fileSystem.getArrayList().get(i).getNameFlower());
                    out.println(fileSystem.getArrayList().get(i).getColorFlower());
                    out.println(fileSystem.getArrayList().get(i).getLengthFlower());
                }
                out.close();
                this.fileSystem.setRead(true);
                i++;
            }
                break;
            //Если данные записываются второй раз, то запись идет в 2 файла
            case 1:
            {
                PrintWriter out = null;
                PrintWriter out2 = null;
                try {
                    out = new PrintWriter(fileSystem.getFile3().getAbsoluteFile());
                    out2 = new PrintWriter(fileSystem.getFile2().getAbsoluteFile());
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                }
                for(int i =0; i < fileSystem.getArrayList().size(); i++)
                {
                    out.println(fileSystem.getArrayList().get(i).getNameFlower());
                    out.println(fileSystem.getArrayList().get(i).getColorFlower());
                    out.println(fileSystem.getArrayList().get(i).getLengthFlower());
                }
                for(int i =0; i < fileSystem.getArrayList().size(); i++)
                {
                    out2.println(fileSystem.getArrayList().get(i).getNameFlower());
                    out2.println(fileSystem.getArrayList().get(i).getColorFlower());
                    out2.println(fileSystem.getArrayList().get(i).getLengthFlower());
                }
                out.close();
                out2.close();
                this.fileSystem.setRead(true);
                i++;
            }
            break;
        }
    }
}
 
//Писатель записывает и изменяет данные в список для читателя
class Writer implements Runnable{
 
    //Ссылка на общую систему с читателем
    private FileSystem fileSystem;
    //Флаг для определения, какой массив должен быть добавлен в системy
    private int i;
 
    public Writer(FileSystem FS)
    {
        this.fileSystem = FS;
        this.i = 0;
    }
 
    @Override
    public void run() {
 
        ArrayList<Flower> fw = null;
 
        switch (i) {
            //Если поток работает первый раз, то данные из файла поступают в массив системы
            case 0: {
                //Проверка
                ArrayList<String> Test = new ArrayList<String>();
                try {
                    BufferedReader reader = new BufferedReader(new FileReader(fileSystem.getFile1()));
                    String line;
                    while ((line = reader.readLine()) != null) {
                        Test.add(line);
                    }
                } catch(IOException e) {
                    throw new RuntimeException(e);
                }
                System.out.println(Test.size());
                fw = new ArrayList<Flower>();
                for(int i = 0; i<Test.size();i+=3)
                {
                    Flower f = new Flower();
                    f.setNameFlower(Test.get(i));
                    f.setColorFlower(Test.get(i+1));
                    f.setLengthFlower(Integer.parseInt(Test.get(i+2)));
                    fw.add(f);
                }
                System.out.println(fw.size());
                i++;
                this.fileSystem.AddArray(fw);
            }
            break;
            //Если данные уже были считаны из файла, и уже были в массиве, то
            //меняем данные и отправляем в массив
            case 1: {
                for (int i = 0; i < fw.size(); i++) {
                    fw.get(i).setNameFlower("Ромашка");
                    fw.get(i).setColorFlower("Cиний");
                }
                i++;
                this.fileSystem.AddArray(fw);
            }
            break;
        }
 
    }
}
Start.java:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package com.bsuir.psp;
 
import java.io.IOException;
 
public class Start {
    public static void main(String args[]) throws IOException {
        FileSystem fs = new FileSystem();
        Writer writer = new Writer(fs);
        Reader reader = new Reader(fs);
        new Thread(writer).start();
        new Thread(reader).start();
        return;
    }
}
Я так понимаю, что у меня получилось deadlock, так как во второй файл ничего не записывается и программа не завершается. Как исправить?

Добавлено через 1 час 19 минут
Проблема:
Второй поток захватывает монитор и сохраняет данные в файл, но потом не засыпает, тем самым не давая первому потоку выполнить манипуляцию с данными и уснуть.Не могу придумать, как это реализовать, чтобы и 2 поток спал.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.11.2016, 17:31
Ответы с готовыми решениями:

Многопоточность Java (Взаимная блокировка)
Есть пример public class Student { private ArrayList friends = new ArrayList(); public synchronized ArrayList getFriends() ...

Многопоточность. Java. Блокировка
Здравствуйте! Задание такое: есть автобусы(потоки), есть остановки, максимальное количество автобусов на остановке 2, если на остановке два...

Почему происходит взаимная блокировка потоков?
Код из Гербердта Шилдта, глава 11, класс Deadlock // An example of deadlock. class A { synchronized void foo(B b) { String...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.11.2016, 17:31
Помогаю со студенческими работами здесь

Не срабатывает взаимная блокировка
Изучаю многопоточность при запуски данного кода, всегда выводится два потока, компилятор никогда не блокируется,

Взаимная блокировка транзакций
Здравствуйте! Можно ли каким-либо образом на одном компьютере запустить две транзакции, которые будут блокировать друг друга?

Взаимная блокировка потоков
В одной из моих программ, наблюдается взаимная блокировка потоков. Судя по всему это происходит из-за обращения к SysListView32 из...

Мьютексы, взаимная блокировка процессов
процесс1 два раза посылает данные процессу2 на обработку while(i!=2) { pthread_mutex_unlock(mptr); ...

Взаимная блокировка приложений с использованием семафоров
Доброго времени суток всем! Имеется такое задание: Искусственно создать взаимную блокировку потоков с использованием 2 объектов типа...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru