Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб. 7 Java (Вариант 3).docx
Скачиваний:
2
Добавлен:
31.08.2024
Размер:
49.85 Кб
Скачать

Версия 2.1:

package lab_3;

import java.util.concurrent.locks.*;

public class SynchronizedString {

private String data;

private boolean isWriting;

private int numActiveReaders;

private Lock lock;

private Condition canWrite;

private Condition canRead;

public SynchronizedString() {

data = "";

isWriting = false;

numActiveReaders = 0;

lock = new ReentrantLock();

canWrite = lock.newCondition();

canRead = lock.newCondition();

}

public void write(String newData) throws InterruptedException {

lock.lock();

try {

while (isWriting) {

canWrite.await();

}

isWriting = true;

while (numActiveReaders > 0) {

canRead.await();

}

data = newData;

isWriting = false;

canWrite.signal();

} finally {

lock.unlock();

}

}

public String read() throws InterruptedException {

lock.lock();

try {

while (isWriting) {

canRead.await();

}

numActiveReaders++;

String result = data;

numActiveReaders--;

if (numActiveReaders == 0) {

canWrite.signal();

}

return result;

} finally {

lock.unlock();

}

}

}

--------------

public static void main(String[] args) {

SynchronizedString synchronizedString = new SynchronizedString();

Scanner scanner = new Scanner(System.in);

// Ввод количества потоков писателей и читателей

//System.out.print("Введите количество потоков писателей: ");

//int numWriters = scanner.nextInt();

int numWriters = 3;

//System.out.print("Введите количество потоков читателей: ");

//int numReaders = scanner.nextInt();int numReaders

int numReaders = 500;

// Создание и запуск потоков-писателей

for (int i = 0; i < numWriters; i++) {

final int writerNumber = i + 1;

Thread writerThread = new Thread(() -> {

try {

synchronized (synchronizedString) {

//System.out.print("Введите строку для потока писателя " + writerNumber + ": ");

//String input = scanner.next();

String input = "ЗДЕСЬ ПОТОК НОМЕР " + Integer.toString(writerNumber) + "!";

synchronizedString.write(input);

System.out.println("Writer Thread " + writerNumber + ": Успешно записал '" + input + "'");

}

} catch (InterruptedException e) {

e.printStackTrace();

}

});

writerThread.start();

}

// Создание и запуск потоков-читателей

for (int i = 0; i < numReaders; i++) {

final int readerNumber = i + 1;

Thread readerThread = new Thread(() -> {

try {

synchronized (synchronizedString) {

String value = synchronizedString.read();

System.out.println("Reader Thread " + readerNumber + ": Прочитано значение: " + value);

}

} catch (InterruptedException e) {

e.printStackTrace();

}

});

readerThread.start();

}

}

Соседние файлы в предмете Основы языка Java