Файл: Отчет о выполнении лабораторной работы 1 по дисциплине Информатика Преподаватель Бусыгин К. Н.docx
Добавлен: 23.11.2023
Просмотров: 106
Скачиваний: 4
-
Породить 10 потоков, каждый из которых выводит в консоль сообщение «hello from thread N», где N – номер потока (номер потока передать ему через конструктор). Посмотреть, что будет, если перед выходом из главного потока не ожидать завершения порожденных потоков, и если ожидать.
-
Породить 10 потоков, каждый из которых каждую секунду (Thread.sleep()) выводит в консоль свой номер и время, прошедшее с момента его запуска в секундах.
-
Для потоков из п. 2 отменить все потоки через 5 секунд из главного потока через разделяемую память.
-
Реализовать программу, моделирующую задачу производителей-потребителей с десятью производителями и десятью потребителями без использования средств синхронизации. Какие ошибки здесь могут быть?
-
Модифицировать программу из п. 4 с использованием синхронизации с помощью семафоров.
-
Модифицировать программу из п. 4 с использованием синхронизации с помощью блокировок.
-
Вычислить число p с точностью 10–9 с помощью формулы Лейбница, пользуясь пятью потоками.
-
Разобрать задачу обедающих философов (Таненбаум). Реализовать ее для 7 философов с использованием блокировок.
-
Разобрать задачу читателей и писателей (Таненбаум). Реализовать ее для 5 писателей и 10 читателей с помощью блокировок.
-
Предположим, что некий университет в США решил продемонстрировать свою политкорректность, применив известную доктрину Верховного суда США «Отделенный, но равный – по сути неравный» не только к расовой, но и к половой принадлежности, положив конец устоявшейся практике раздельных душевых для мужчин и женщин в своем кампусе. Но уступая традиции, университет вынес решение, что если в душевой находится женщина, то туда может зайти другая женщина, но не мужчина, и наоборот. Символ на сдвижном индикаторе на двери душевой показывает три возможных состояния:
, 20-ти мужчин и 20-ти женщин, где мужчины и женщины представлены в виде потоков, которые некоторое время заняты своими делами, затем хотят в течение некоторого времени помыться в одной на всех душевой, и так в бесконечном цикле.
Код Java:
import java.util.concurrent.locks.*;
import java.util.*;
import java.util.Random;
public class n9 {
static int[] menItog = new int[20];
static int[] womenItog = new int[20];
static int persIn = 0;
static boolean Full = (persIn == 10);
static boolean wshow = false;
static boolean mshow = false;
public static void main(String[] args)throws InterruptedException{
ReentrantLock lock = new ReentrantLock(true);
Condition men = lock.newCondition();
Condition women = lock.newCondition();
Arrays.fill(menItog, 0);
Arrays.fill(womenItog, 0);
Man[] man = new Man[20];
Woman[] woman = new Woman[20];
for(int i = 0; i < 20; i++)
man[i] = new Man(i, lock, men, women, Full, wshow, mshow);
for(int i = 0; i < 20; i++)
woman[i] = new Woman(i, lock, men, women, Full, wshow, mshow);
for(int i = 0; i < 20; i++)
man[i].start();
for(int i = 0; i < 20; i++)
woman[i].start();
for(int i = 0; i < 20; i++)
man[i].join();
for(int i = 0; i < 20; i++)
woman[i].join();
System.out.println(Arrays.toString(menItog) + " muzhchin");
System.out.println(Arrays.toString(womenItog) + " zhenshchin");
}
}
class Shower{
static Stack
}
class Man extends Thread{
int n;
ReentrantLock lock;
Condition men;
Condition women;
boolean Full;
boolean wshow;
boolean mshow;
Man(int n, ReentrantLock lock, Condition men, Condition women, boolean Full, boolean wshow, boolean mshow){
this.n = n;
this.lock = lock;
this.men = men;
this.women = women;
this.Full = Full;
this.wshow = wshow;
this.mshow = mshow;
}
public void run(){
int b = 0;
try{
while (b < 10000){
Thread.sleep(10);
Random r = new Random();
lock.lock();
while(Full || wshow)
women.await();
if(mshow == false)
mshow = true;
Shower.showerStack.push(r.nextInt(100));
n9.persIn++;
lock.unlock();
lock.lock();
n9.menItog[n]++;
Shower.showerStack.pop();
if(Shower.showerStack.empty()){
mshow = false;
men.signalAll();
}
lock.unlock();
System.out.println(Arrays.toString(n9.menItog)+ " muzhchin");
b++;
}
}
catch(InterruptedException e){}
}
}
class Woman extends Thread{
int n;
ReentrantLock lock;
Condition men;
Condition women;
boolean Full;
boolean wshow;
boolean mshow;
Woman(int n, ReentrantLock lock, Condition men, Condition women, boolean Full, boolean wshow, boolean mshow){
this.n = n;
this.lock = lock;
this.men = men;
this.women = women;
this.Full = Full;
this.wshow = wshow;
this.mshow = mshow;
}
public void run(){
int b = 0;
try{
while (b < 10000){
Thread.sleep(10);
Random rnd = new Random();
lock.lock();
while(Full || mshow)
men.await();
if(wshow == false)
wshow = true;
Shower.showerStack.push(rnd.nextInt(100));
n9.persIn++;
lock.unlock();
lock.lock();
n9.womenItog[n]++;
Shower.showerStack.pop();
if(Shower.showerStack.empty()){
wshow = false;
women.signalAll();
}
lock.unlock();
System.out.println(Arrays.toString(n9.womenItog)+ " zhenshchin");
b++;
}
}
catch(InterruptedException e){}
}
}