Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/29: Рейтинг темы: голосов - 29, средняя оценка - 4.55
8 / 8 / 6
Регистрация: 29.01.2014
Сообщений: 61
1

Многопоточность. Читетель и много писателей

13.05.2015, 11:22. Показов 5310. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте,
необходимо решить проблему "Читатели-писатели". с учетом следующих ограничений:
Есть общий ресурс, из которого можно читать или писать.
В системе есть N потоков читателей и M потоков писателей. Они работают так: в бесконечном цикле сначала спят случайный интервал времени, потом пытаются получить доступ на чтение/запись, после получения доступа выполняют эту операцию случайный интервал времени.
Чтение может происходить несколькими потоками одновременно, но не больше K.
Когда какой-то из потоков производит запись, остальные не должны иметь доступа к ресурсу.
Если писатель пишет, никто другой не может иметь доступа к ресурсу.Если писатель хочет записывать, но в это время читатели читают, он должен ждать, пока читатели завершат чтение, но другие читатели уже не могут начинать чтение, пока писатель не начнет записть. Результаты работы программы должны отображаться в консоли по мере их появления, как показано ниже. Вывод должен быть синхронизированным, т.е. последовательность строк в логе должна соответствовать последовательности

12:01:10.353 Читатель 1 хочет читать. | Ресурс свободен.
12:01:10.354 Читатель 1 начал чтение. | Читатель 1
читает.
12:01:10.453 Читатель 2 хочет читать. | Читатель 1
читает.
12:01:10.456 Читатель 2 начал чтение. | Читатели 1, 2
читают.
12:01:11.000 Писатель 1 хочет писать. | Читатели 1, 2
читают.
12:01:11.001 Читатели 1 и 2 прерваны. | Ресурс свободен.
12:05:11.005 Писатель 1 начал запись. | Писатель 1 пишет.
12:06:30.300 Читатель 1 хочет читать. | Писатель 1 пишет.
Читатель 1 ожидает.


Вот что получилось у меня. При таком иполнении потоки-читатели не могут добраться к ресурсу вообще. Может ли кто помочь исправить код.
Спасибо большое!

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
import java.util.Random;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
 
public class ReaderWriter<T> {
    Random rand = new Random();
    private BlockingQueue<Thread> queue = new ArrayBlockingQueue<Thread>(7);
    private ReadWriteLock rwLock = new ReentrantReadWriteLock();
    private Lock readLock = rwLock.readLock();
    private Lock writeLock = rwLock.writeLock();
 
    public void read() {
        readLock.lock();
        try {
            queue.add(Thread.currentThread());
           for(Thread t : queue) {
                System.out.print(t.getName()+" ");
            }
            System.out.println(" is reading;");
            try {
                Thread.currentThread().sleep(rand.nextInt(3000));
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        } finally {
            queue.remove(Thread.currentThread());
            readLock.unlock();
        }
    }
 
    public void write() {
        writeLock.lock();
        try {
            System.out.println(Thread.currentThread().getName() + " is writing!");
            try {
                Thread.currentThread().sleep(rand.nextInt(3000));
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        } finally {
            writeLock.unlock();
        }
    }
    public boolean isLockedRead(){
        return readLock.tryLock();
    }
    public boolean isLockedWrite(){
        return writeLock.tryLock();
    }
}
class Reader implements Runnable {
    Random rand = new Random();
    private ReaderWriter readerWriter;
    public Reader(ReaderWriter rw){
        readerWriter=rw;
    }
    @Override
    public void run() {
        while(true){
            if(readerWriter.isLockedRead()){
                readerWriter.read();
           }else{
                System.out.println(Thread.currentThread().getName()+" is waiting to read!");
                try {
                    Thread.currentThread().sleep(rand.nextInt(3000));
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
class Writer implements Runnable {
    Random rand = new Random();
    private ReaderWriter readerWriter;
    public Writer(ReaderWriter rw){
        readerWriter=rw;
    }
    @Override
    public void run() {
        while(true){
            if(readerWriter.isLockedWrite()){
 
                readerWriter.write();
            }else{
                System.out.println(Thread.currentThread().getName()+" is waiting to write!");
                try {
                    Thread.currentThread().sleep(rand.nextInt(3000));
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
class Main{
    public static void main(String[] args) {
        ReaderWriter rw = new ReaderWriter();
        for (int i = 0; i <2 ; i++) {
            new Thread(new Writer(rw)).start();
        }
        for (int i = 0; i <10 ; i++) {
           new Thread(new Reader(rw)).start();
        }
 
    }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.05.2015, 11:22
Ответы с готовыми решениями:

Сформировать файл "BOOK" из фамилий любимых писателей учеников класса (ученики по очереди вводят по три фамилиии писателей). Используя сформированный
Помогите пожалуйста. Вот задача: Сформировать файл &quot;BOOK&quot; из фамилий любимых писателей учеников...

Обсудим *писателей* олимпиад по программированию ?)
Автор: И. Туфанов Входной файл: input.txt Ограничение времени на тест: 1 сек Выходной...

Интересные фразы от писателей и писательниц
Кто ещё что прочёл?

Сайт с большим числом писателей
Недавно решила научиться сайты писать и возник следующий вопрос: допустим, если я хочу создать...

3
63 / 63 / 28
Регистрация: 18.03.2014
Сообщений: 794
13.05.2015, 12:46 2
В код сильно не вникал, что могу сказать, для данной цели почитайте про synhronized
0
8 / 8 / 6
Регистрация: 29.01.2014
Сообщений: 61
13.05.2015, 19:04  [ТС] 3
Да я знаю про это, но дело в том, что при использовании wait()/notify()/notifyAll() возникает другая проблема: как при освобождении ресурса оним читателем освободить его только для читателей, а писателя оставить торчать внутри wait()?
Может синхронизироваться по разных обьектах?
0
Автоматизируй это!
Эксперт Python
7107 / 4610 / 1215
Регистрация: 30.03.2015
Сообщений: 13,236
Записей в блоге: 29
13.05.2015, 19:36 4
может очередь попробовать?

Добавлено через 12 минут
хотя нет, у тебя вроде и так все нормально...сейчас код посмотрю
0
13.05.2015, 19:36
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.05.2015, 19:36
Помогаю со студенческими работами здесь

Межпроцессная синхронизация: проблема читателей и писателей
Возможно ли сделать решение проблемы читателей и писателей ? - читателей много - пишет лишь...

Создать список - combobox из пяти писателей
Задача в принципе не сложная,но я новичек и не знаю как ее записать(условие во вложении) ...

Создаю прогу для технических писателей
Добрый день всем! Я только начинаю познавать основы языка и мне нужна помощь! ПОМОГИТЕ, ПЛИЗ. А то...

Работа для программистов и техн.писателей
Телеработа (дистанционная работа) для программистов и технических писателей http://infobel.narod.ru


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

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