КДП/Лаб 1 РТИ 2023 — разлика између измена
< КДП
Пређи на навигацију
Пређи на претрагу
(Dodata nova stranica) |
м (KockaAdmiralac преместио је страницу КДП/Лаб 1 2023 — уређивање на КДП/Лаб 1 2023 без остављања преусмерења: Ispravljen naziv stranice) |
(нема разлике)
| |
Верзија на датум 27. децембар 2023. у 20:57
Поставка
У зависности од групе било је потребно решити један од следећих проблема:
1. Решити Унисеx Батхроом проблем користећи ReentrantLock. Потребно је да програм буде максимално конкурентан.
2. Решити Атомиц Броадцаст проблем користећи AtomicInteger. Потребно је да програм буде максимално конкурентан.
Решење
Испод је решење за Unisex Bathroom.
Test.java
package UnisexBathLocksLab1PrvaGrupa;
public class Test {
public static void main(String[] args) {
int m = 5;
int w = 5;
int N = 4;
Bathroom b = new Bathroom(N);
Thread mt[] = new Thread[m];
Thread wt[] = new Thread[m];
for(int i = 0; i < m; i++) {
mt[i] = new Man(b);
mt[i].start();
}
for(int i = 0; i < w; i++) {
wt[i] = new Woman(b);
wt[i].start();
}
}
}
Woman.java
package UnisexBathLocksLab1PrvaGrupa;
public class Woman extends Thread{
public int id;
public static int running_id = 0;
Bathroom bath;
public Woman(Bathroom bath) {
id = running_id++;
this.bath = bath;
}
@Override
public void run() {
while(true) {
bath.w_enter(id);
try {
Thread.sleep((int)(Math.random() * 1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
bath.w_exit(id);
}
}
}
Man.java
package UnisexBathLocksLab1PrvaGrupa;
public class Man extends Thread{
public int id;
public static int running_id = 0;
Bathroom bath;
public Man(Bathroom bath) {
id = running_id++;
this.bath = bath;
}
@Override
public void run() {
while(true) {
bath.m_enter(id);
try {
Thread.sleep((int)(Math.random() * 1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
bath.m_exit(id);
}
}
}
Bathroom.java
package UnisexBathLocksLab1PrvaGrupa;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Bathroom {
private int woman_cnt = 0;
private int man_cnt = 0;
private int capacity = 0;
Lock lock = new ReentrantLock();
Condition all = lock.newCondition();
private int ticket = 0;
private int next = 0;
public Bathroom(int N) {
this.ticket = 0;
this.next = 0;
this.man_cnt = 0;
this.woman_cnt = 0;
this.capacity = N;
}
public void m_enter(int id) {
lock.lock();
try {
int my_ticket = ticket++;
System.out.println("Man(" + id + ") waiting");
while (my_ticket != next || woman_cnt > 0 || man_cnt >= capacity) {
all.awaitUninterruptibly();
}
System.out.println("Man(" + id + ") entered");
man_cnt += 1;
this.next += 1;
} finally {
lock.unlock();
}
}
public void m_exit(int id) {
lock.lock();
try {
System.out.println("Man(" + id + ") left");
man_cnt -= 1;
all.signalAll();
} finally {
lock.unlock();
}
}
public void w_enter(int id) {
lock.lock();
try {
int my_ticket = ticket++;
System.out.println("Woman(" + id + ") waiting");
while (my_ticket != next || man_cnt > 0 || woman_cnt >= capacity) {
all.awaitUninterruptibly();
}
System.out.println("Woman(" + id + ") entered");
woman_cnt += 1;
next += 1;
} finally {
lock.unlock();
}
}
public void w_exit(int id) {
lock.lock();
try {
System.out.println("Woman(" + id + ") left");
woman_cnt -= 1;
all.signalAll();
} finally {
lock.unlock();
}
}
}