传统版:(传统版Lock)
package InterviewTest;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
class ShareData{
private int number = 0;
private Lock lock = new ReentrantLock();
private Condition condition = lock.newCondition();
public void increment() throws Exception{
lock.lock();
try {
while(number!=0) {
condition.await();
}
number++;
System.out.println(Thread.currentThread().getName()+" " +number);
condition.signalAll();
} catch (Exception e) {
e.printStackTrace();
}finally {
lock.unlock();
}
}
public void decrement() throws Exception{
lock.lock();
try {
while(number==0) {
condition.await();
}
number--;
System.out.println(Thread.currentThread().getName()+" " +number);
condition.signalAll();
} catch (Exception e) {
e.printStackTrace();
}finally {
lock.unlock();
}
}
}
public class ProdConsumer_TraditionDemo {
public static void main(String[] args) {
ShareData shareData = new ShareData();
for(int i=1;i<=5;i++) {
new Thread(()->{
try {
shareData.increment();
} catch (Exception e) {
e.printStackTrace();
}
},"AAA").start();
new Thread(()->{
try {
shareData.decrement();
} catch (Exception e) {
e.printStackTrace();
}
},"BBB").start();
new Thread(()->{
try {
shareData.increment();
} catch (Exception e) {
e.printStackTrace();
}
},"AAACC").start();
new Thread(()->{
try {
shareData.decrement();
} catch (Exception e) {
e.printStackTrace();
}
},"BBBDD").start();
}
}
}
阻塞队列版:ArrayBlockingQueue
package InterviewTest;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
class MyResource{
private volatile boolean FLAG = true;
private AtomicInteger atomicInteger = new AtomicInteger();
BlockingQueue<String> blockingQueue = null;
public MyResource(BlockingQueue<String> blockingQueue) {
this.blockingQueue = blockingQueue;
System.out.println(blockingQueue.getClass().getName());
}
public void myProd() throws Exception{
String data = null;
boolean retValue;
while(FLAG) {
data = atomicInteger.incrementAndGet()+"";
retValue=blockingQueue.offer(data,2L,TimeUnit.SECONDS);
if(retValue) {
System.out.println(Thread.currentThread().getName()+" 插入队列"+
data+"成功!");
}else {
System.out.println(Thread.currentThread().getName()+" 插入队列"+
data+"失败!");
}
TimeUnit.SECONDS.sleep(1);
}
System.out.println(Thread.currentThread().getName()
+" 大老板叫停了,FLAG==false,生产停止");
}
public void myConsumer() throws Exception{
String result = null;
while(FLAG) {
result = blockingQueue.poll(2L,TimeUnit.SECONDS);
if(null==result||result.equalsIgnoreCase("")) {
FLAG=false;
System.out.println(Thread.currentThread().getName()+
" 超过两秒钟没有取到蛋糕,消费退出");
System.out.println();
System.out.println();
return;
}
System.out.println(Thread.currentThread().getName()
+" 消费蛋糕"+result+"成功!");
}
}
public void stop() {
this.FLAG=false;
}
}
public class ProduConSumer_BlockQueueDemo {
public static void main(String[] args) {
MyResource myResource = new MyResource(new ArrayBlockingQueue<>(10));
new Thread(()->{
System.out.println(Thread.currentThread().getName()+" 生产线程启动");
System.out.println();
System.out.println();
try {
myResource.myProd();
System.out.println();
System.out.println();
System.out.println();
} catch (Exception e) {
e.printStackTrace();
}
},"Prod").start();
new Thread(()->{
System.out.println(Thread.currentThread().getName()+" 消费线程启动");
System.out.println();
System.out.println();
try {
myResource.myConsumer();
System.out.println();
System.out.println();
System.out.println();
} catch (Exception e) {
e.printStackTrace();
}
},"Consumer").start();
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println();
System.out.println();
System.out.println();
System.out.println("时间到,停止生产和消费");
myResource.stop();
}
}