added ex O
This commit is contained in:
parent
f2bb16ea85
commit
1255f304fc
51
src/exercises/ex_o/LockedWithConditionsStack.java
Normal file
51
src/exercises/ex_o/LockedWithConditionsStack.java
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
package exercises.ex_o;
|
||||||
|
|
||||||
|
import java.util.Stack;
|
||||||
|
import java.util.concurrent.locks.Condition;
|
||||||
|
import java.util.concurrent.locks.ReentrantLock;
|
||||||
|
|
||||||
|
public class LockedWithConditionsStack {
|
||||||
|
private final int capacity;
|
||||||
|
private final Stack<Integer> stack = new Stack<>();
|
||||||
|
private final ReentrantLock lock = new ReentrantLock();
|
||||||
|
private final Condition fullCondition = lock.newCondition();
|
||||||
|
private final Condition emptyCondition = lock.newCondition();
|
||||||
|
|
||||||
|
public LockedWithConditionsStack(int capacity) {
|
||||||
|
this.capacity = capacity;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void pushToStack(int value) {
|
||||||
|
try {
|
||||||
|
lock.lock();
|
||||||
|
while (stack.size() == capacity) {
|
||||||
|
System.out.println("Stack is full, waiting until someone pops");
|
||||||
|
fullCondition.await();
|
||||||
|
}
|
||||||
|
stack.push(value);
|
||||||
|
emptyCondition.signalAll();
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
} finally {
|
||||||
|
lock.unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public int popFromStack() {
|
||||||
|
int value;
|
||||||
|
try {
|
||||||
|
lock.lock();
|
||||||
|
while (stack.isEmpty()) {
|
||||||
|
System.out.println("Stack is empty, waiting until someone pushes");
|
||||||
|
emptyCondition.await();
|
||||||
|
}
|
||||||
|
value = stack.pop();
|
||||||
|
fullCondition.signalAll();
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
} finally {
|
||||||
|
lock.unlock();
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
}
|
16
src/exercises/ex_o/NumberConsumer.java
Normal file
16
src/exercises/ex_o/NumberConsumer.java
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
package exercises.ex_o;
|
||||||
|
|
||||||
|
public class NumberConsumer implements Runnable {
|
||||||
|
private LockedWithConditionsStack stack;
|
||||||
|
|
||||||
|
public NumberConsumer(LockedWithConditionsStack stack) {
|
||||||
|
this.stack = stack;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
while (true) {
|
||||||
|
System.out.println("Pop from stack: " + stack.popFromStack());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
17
src/exercises/ex_o/NumberProducer.java
Normal file
17
src/exercises/ex_o/NumberProducer.java
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
package exercises.ex_o;
|
||||||
|
|
||||||
|
public class NumberProducer implements Runnable {
|
||||||
|
private LockedWithConditionsStack stack;
|
||||||
|
public NumberProducer(LockedWithConditionsStack stack) {
|
||||||
|
this.stack = stack;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
for (int i = 0; i < 100; i++) {
|
||||||
|
System.out.println("Pushing to stack " + i + "...");
|
||||||
|
stack.pushToStack(i);
|
||||||
|
System.out.println("Pushed to stack " + i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,9 @@
|
|||||||
|
package exercises.ex_o;
|
||||||
|
|
||||||
|
public class TestingReentrantLockWithConditions {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
LockedWithConditionsStack stack = new LockedWithConditionsStack(5);
|
||||||
|
(new Thread(new NumberProducer(stack))).start();
|
||||||
|
(new Thread(new NumberConsumer(stack))).start();
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user