Add OOP/Java/Assignments/FISAC/Q10.java
This commit is contained in:
parent
dd548e1c66
commit
54711066ac
85
OOP/Java/Assignments/FISAC/Q10.java
Normal file
85
OOP/Java/Assignments/FISAC/Q10.java
Normal file
@ -0,0 +1,85 @@
|
||||
import java.util.concurrent.locks.*;
|
||||
|
||||
class FullException extends Exception {
|
||||
FullException(String msg) { super(msg); }
|
||||
}
|
||||
|
||||
class Box<T> {
|
||||
private T[] items = (T[]) new Object[3];
|
||||
private int count = 0;
|
||||
private Lock lock = new ReentrantLock();
|
||||
private Condition notFull = lock.newCondition(), notEmpty = lock.newCondition();
|
||||
|
||||
void add(T item) throws FullException, InterruptedException {
|
||||
lock.lock();
|
||||
try {
|
||||
if (count == items.length) throw new FullException("Box is full");
|
||||
while (count == items.length) notFull.await();
|
||||
items[count++] = item;
|
||||
notEmpty.signal();
|
||||
} finally {
|
||||
lock.unlock();
|
||||
}
|
||||
}
|
||||
|
||||
T retrieve() throws InterruptedException {
|
||||
lock.lock();
|
||||
try {
|
||||
while (count == 0) notEmpty.await();
|
||||
T item = items[--count];
|
||||
notFull.signal();
|
||||
return item;
|
||||
} finally {
|
||||
lock.unlock();
|
||||
}
|
||||
}
|
||||
|
||||
boolean isEmpty() {
|
||||
return count == 0;
|
||||
}
|
||||
|
||||
void clear() {
|
||||
count = 0;
|
||||
}
|
||||
}
|
||||
|
||||
class Student {
|
||||
String name;
|
||||
Student(String name) { this.name = name; }
|
||||
public String toString() { return name; }
|
||||
}
|
||||
|
||||
public class Main {
|
||||
public static void main(String[] args) throws Exception {
|
||||
Box<Integer> intBox = new Box<>();
|
||||
Box<String> strBox = new Box<>();
|
||||
Box<Student> studentBox = new Box<>();
|
||||
|
||||
Thread t1 = new Thread(() -> {
|
||||
try {
|
||||
intBox.add(1);
|
||||
intBox.add(2);
|
||||
intBox.add(3);
|
||||
System.out.println(intBox.retrieve());
|
||||
} catch (Exception e) { e.printStackTrace(); }
|
||||
});
|
||||
|
||||
Thread t2 = new Thread(() -> {
|
||||
try {
|
||||
strBox.add("Hello");
|
||||
System.out.println(strBox.retrieve());
|
||||
} catch (Exception e) { e.printStackTrace(); }
|
||||
});
|
||||
|
||||
Thread t3 = new Thread(() -> {
|
||||
try {
|
||||
studentBox.add(new Student("Alice"));
|
||||
System.out.println(studentBox.retrieve());
|
||||
} catch (Exception e) { e.printStackTrace(); }
|
||||
});
|
||||
|
||||
t1.start();
|
||||
t2.start();
|
||||
t3.start();
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user