多线程之生产者消费者模式

2019-08-28 wjy329 Java学习 43

/**
* @description: 资源类
* @author: wjy329
* @create: 2019-08-28 10:31
**/
class Resource {
//资源初始化个数
private int init;
//资源最大个数
private int Max;

public Resource(int init, int Max) {
this.init = init;
this.Max = Max;
}

//生产资源的方法
public synchronized void add() {
if (init < Max) {
System.out.println(Thread.currentThread().getName() + "生产一个资源," + "当前一共" + ++init + "个资源");
//通知消费者消耗资源
notifyAll();
} else {
try {
System.out.println("资源已满" + Thread.currentThread().getName() + "进入休息");
//进入休息状态
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

//消耗资源的方法
public synchronized void sub() {
if (init > 0) {
System.out.println(Thread.currentThread().getName() + "消费一个资源," + "当前一共" + --init + "个资源");
//唤醒生产者生产资源
notifyAll();
} else {
try {
System.out.println("资源已全部消耗" + Thread.currentThread().getName() + "进入等待");
//等待资源生产
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}

class Consumer extends Thread {
private Resource resource;

public Consumer(Resource resource, String name) {
super(name);
this.resource = resource;
}

@Override
public void run() {
while (true) {
try {
//休眠模拟消耗资源消耗的时间
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
resource.sub();
}
}
}

class Producer extends Thread {
private Resource resource;

public Producer(Resource resource, String name) {
super(name);
this.resource = resource;
}

@Override
public void run() {
while (true) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
resource.add();
}
}
}

public class TestProAndCon {
public static void main(String[] args) throws InterruptedException {
Resource resource = new Resource(0, 15);
new Consumer(resource, "消费者1").start();
new Consumer(resource, "消费者2").start();
new Consumer(resource, "消费者3").start();
new Producer(resource, "生产者1").start();
new Producer(resource, "生产者2").start();
new Producer(resource, "生产者3").start();
new Producer(resource, "生产者4").start();
new Producer(resource, "生产者5").start();
}
}

输出结果:

资源已全部消耗消费者1进入等待

资源已全部消耗消费者3进入等待

资源已全部消耗消费者2进入等待
生产者2生产一个资源,当前一共1个资源
生产者5生产一个资源,当前一共2个资源
生产者4生产一个资源,当前一共3个资源
生产者3生产一个资源,当前一共4个资源
生产者1生产一个资源,当前一共5个资源
生产者2生产一个资源,当前一共6个资源
消费者2消费一个资源,当前一共5个资源
生产者4生产一个资源,当前一共6个资源
消费者3消费一个资源,当前一共5个资源
生产者5生产一个资源,当前一共6个资源
消费者1消费一个资源,当前一共5个资源
生产者1生产一个资源,当前一共6个资源
生产者3生产一个资源,当前一共7个资源
消费者2消费一个资源,当前一共6个资源
生产者3生产一个资源,当前一共7个资源
生产者1生产一个资源,当前一共8个资源
消费者1消费一个资源,当前一共7个资源
生产者2生产一个资源,当前一共8个资源
生产者5生产一个资源,当前一共9个资源
生产者4生产一个资源,当前一共10个资源
消费者3消费一个资源,当前一共9个资源
消费者1消费一个资源,当前一共8个资源
消费者2消费一个资源,当前一共7个资源
生产者4生产一个资源,当前一共8个资源
生产者1生产一个资源,当前一共9个资源
消费者3消费一个资源,当前一共8个资源
生产者5生产一个资源,当前一共9个资源
生产者3生产一个资源,当前一共10个资源
生产者2生产一个资源,当前一共11个资源
消费者1消费一个资源,当前一共10个资源
消费者2消费一个资源,当前一共9个资源
生产者4生产一个资源,当前一共10个资源
生产者5生产一个资源,当前一共11个资源
消费者3消费一个资源,当前一共10个资源
生产者2生产一个资源,当前一共11个资源
生产者3生产一个资源,当前一共12个资源
生产者1生产一个资源,当前一共13个资源
消费者2消费一个资源,当前一共12个资源
生产者4生产一个资源,当前一共13个资源
消费者1消费一个资源,当前一共12个资源
生产者5生产一个资源,当前一共13个资源
消费者3消费一个资源,当前一共12个资源
生产者1生产一个资源,当前一共13个资源
生产者3生产一个资源,当前一共14个资源
生产者2生产一个资源,当前一共15个资源
消费者2消费一个资源,当前一共14个资源
生产者4生产一个资源,当前一共15个资源
消费者1消费一个资源,当前一共14个资源
生产者5生产一个资源,当前一共15个资源
资源已满生产者1进入休息
资源已满生产者2进入休息
消费者3消费一个资源,当前一共14个资源
生产者3生产一个资源,当前一共15个资源
消费者2消费一个资源,当前一共14个资源
生产者4生产一个资源,当前一共15个资源
消费者1消费一个资源,当前一共14个资源
生产者5生产一个资源,当前一共15个资源
资源已满生产者3进入休息
资源已满生产者2进入休息
消费者3消费一个资源,当前一共14个资源
生产者1生产一个资源,当前一共15个资源
消费者2消费一个资源,当前一共14个资源
生产者4生产一个资源,当前一共15个资源
消费者1消费一个资源,当前一共14个资源
生产者5生产一个资源,当前一共15个资源
消费者3消费一个资源,当前一共14个资源
生产者3生产一个资源,当前一共15个资源
资源已满生产者1进入休息
资源已满生产者2进入休息
消费者2消费一个资源,当前一共14个资源
消费者1消费一个资源,当前一共13个资源
生产者5生产一个资源,当前一共14个资源
生产者4生产一个资源,当前一共15个资源
消费者3消费一个资源,当前一共14个资源
生产者3生产一个资源,当前一共15个资源
消费者2消费一个资源,当前一共14个资源
消费者1消费一个资源,当前一共13个资源
生产者5生产一个资源,当前一共14个资源
生产者4生产一个资源,当前一共15个资源


原文地址:https://blog.csdn.net/qq_34101608/article/details/80633388
本文作者:wjy329
版权声明:本博客除特殊说明外均属本人原创。如需转载请署名作者及文章出处。
评论