package test;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ConsumerProducer {
private static Buffer buffer = new Buffer();
public static void main(String args[]){
ExecutorService exe = Executors.newFixedThreadPool(2);
exe.execute(new produceTask());
exe.execute(new consumerTask());
exe.shutdown();
}
public static class produceTask implements Runnable{
@Override
public void run() {
int i = 1;
try{
while(true){
System.out.println("produce write"+i);
buffer.write(i++);
Thread.sleep((int) (Math.random()+1000));
}
}
catch(InterruptedException ex){
ex.printStackTrace();
}
}
}
public static class consumerTask implements Runnable{
@Override
public void run() {
try{
while(true){
System.out.println("\t\tconsumer delete "+buffer.remove());
buffer.remove();
Thread.sleep((int) (Math.random()+1000));
}
}
catch(InterruptedException ex){
ex.printStackTrace();
}
}
}
}
package test;
import java.util.LinkedList;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Buffer {
int CAPACITY = 1;
private LinkedList<Integer> myquene = new LinkedList<>();
private static Lock lock = new ReentrantLock();
private static Condition notempty = lock.newCondition();
private static Condition notfull = lock.newCondition();
public int remove() {
int value = 0;
lock.lock();
try{
while(myquene.isEmpty()){
System.out.println("\t\twait for notempty conditon");
notempty.await();
}
value = myquene.remove();
notfull.signal();
}
catch(InterruptedException ex){
ex.printStackTrace();
}
finally{
lock.unlock();
return value;
}
}
public void write(int i) {
lock.lock();
try{
while(myquene.size() == CAPACITY){
System.out.println("wait for not full condition");
notfull.await();
}
myquene.offer(i);
notempty.signal();
}
catch(InterruptedException ex){
ex.printStackTrace();
}
finally{
lock.unlock();
}
}
}
程序运行的结果如下所示
produce write1
consumer delete 1
wait for notempty conditon
produce write2
produce write3
wait for notempty conditon
consumer delete 3
wait for notempty conditon
produce write4
wait for notempty conditon
produce write5
consumer delete 5
wait for notempty conditon
produce write6
produce write7
wait for notempty conditon
consumer delete 7
wait for notempty conditon
produce write8
produce write9
wait for notempty conditon
consumer delete 9
wait for notempty conditon
produce write10
wait for notempty conditon
produce write11
consumer delete 11
wait for notempty conditon
produce write12
wait for notempty conditon
produce write13
consumer delete 13
wait for notempty conditon
produce write14
produce write15
consumer delete 15
wait for notempty conditon
produce write16
wait for notempty conditon
produce write17
consumer delete 17
wait for notempty conditon
produce write18
wait for notempty conditon
produce write19
consumer delete 19
wait for notempty conditon
produce write20
wait for notempty conditon
produce write21
consumer delete 21
wait for notempty conditon
produce write22
produce write23
wait for notempty conditon
consumer delete 23
wait for notempty conditon
produce write24
wait for notempty conditon
produce write25
consumer delete 25
wait for notempty conditon
produce write26
produce write27
wait for notempty conditon
consumer delete 27
wait for notempty conditon
produce write28
wait for notempty conditon
produce write29
consumer delete 29
wait for notempty conditon