生产者-消费者 传统版本
/**
* 生产者,消费者传统版
*/
class MyData{ //资源类
private int number;
private Lock lock = new ReentrantLock();
private Condition condition = lock.newCondition();
public void increase(){
try {
lock.lock();
while (number!=0){ //防止虚假唤醒->使用循环判断
condition.await();
}
number++;
System.out.println(Thread.currentThread().getName()+"\t"+number);
condition.signalAll();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void decrease(){
try {
lock.lock();
while (number==0){
condition.await();
}
number--;
System.out.println(Thread.currentThread().getName()+"\t"+number);
condition.signalAll();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
public class test {
public static void main(String[] args) {
MyData data = new MyData();
new Thread(()->{
for (int i = 0; i <5 ; i++) {
data.increase();
}
},"A").start();
new Thread(()->{
for (int i = 0; i <5 ; i++) {
data.decrease();
}
},"B").start();
}
}
输出结果
A 1
B 0
A 1
B 0
A 1
B 0
A 1
B 0
A 1
B 0
生产者-消费者-阻塞队列版本
class MyResource{
private volatile boolean FLAG = true;
private AtomicInteger atomicInteger = new AtomicInteger();
BlockingQueue<String> blockingQueue = null;
public MyResource(BlockingQueue<String> blockingQueue) {
this.blockingQueue = blockingQueue;
}
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()+"\t插入队列"+data+"成功");
}else{
System.out.println(Thread.currentThread().getName()+"\t插入队列"+data+"失败");
}
TimeUnit.SECONDS.sleep(2);
}
System.out.println(Thread.currentThread().getName()+"\tFLAG==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()+"\t超过2秒没有取到蛋糕,消费退出");
System.out.println();
System.out.println();
return;
}
System.out.println(Thread.currentThread().getName()+"\t 消费队列"+result+"成功");
}
}
public void stop(){
FLAG = false;
}
}
public class test2 {
public static void main(String[] args) throws InterruptedException {
MyResource resource = new MyResource(new ArrayBlockingQueue<String>(10));
new Thread(()->{
System.out.println(Thread.currentThread().getName()+"\t 线程消费启动");
try {
resource.myConsumer();
} catch (Exception e) {
e.printStackTrace();
}
},"Consumer").start();
new Thread(()->{
System.out.println(Thread.currentThread().getName()+"\t 线程生产启动");
try {
resource.myProd();
} catch (Exception e) {
e.printStackTrace();
}
},"Prod").start();
TimeUnit.SECONDS.sleep(4);
System.out.println();
System.out.println();
System.out.println();
System.out.println(Thread.currentThread().getName()+"\t 叫停,活动结束");
resource.stop();
}
}
输出结果
Consumer 线程消费启动
Prod 线程生产启动
Prod 插入队列1成功
Consumer 消费队列1成功
Prod 插入队列2成功
Consumer 消费队列2成功
main 叫停,活动结束
Prod FLAG==FALSE,生产动作结束
Consumer 超过2秒没有取到蛋糕,消费退出