生产者、消费者模式
打一个比方,有三个对象:吃货、餐桌和厨师,分别是消费者、中间缓冲区和生产者。厨师生产面包,放在桌上;桌上摆放面包;吃货从桌上取面包,吃掉。
为了能让行为运转下去,厨师和消费者是两个线程,依靠桌子上是否有面包来判断各自线程需要做的事情:
厨师:如果没有面包,就生产面包;如果有面包,叫吃货来吃面包;
吃货:如果有面包,就吃面包;如果没有面包,叫厨师生产面包;
概念知识参考(blog.csdn.net/kaiwii/arti…
生产者、消费者模式代码实现
/**
* 桌子:记录是否有面包的标志和提供锁对象
*/
public class Desk {
/**
* 是否有面包标志,true表示有,false表示没有
*/
public static boolean flag = false;
/**
* 锁对象
*/
public static Object lock = new Object();
}
/**
* 厨师(生产者)
*/
public class Cooker extends Thread {
@Override
public void run() {
while (true) {
// 给以下代码块设置锁
synchronized (Desk.lock) {
// 厨师判断如果有面包
if (Desk.flag) {
try {
// 等待吃货来告知没有面包了
Desk.lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
// 如果厨师判断没有面包,就生产面包
System.out.println("厨师" + Thread.currentThread().getName() + "正在做面包");
// 设置桌上有面包,将flag设置为true
Desk.flag = true;
// 告知吃货线程,桌上有面包了,来吃
Desk.lock.notifyAll();
}
}
}
}
}
/**
* 吃货(消费者)
*/
public class Foodies extends Thread {
@Override
public void run() {
while (true) {
synchronized (Desk.lock) {
// 如果桌上没有面包
if (!Desk.flag) {
try {
// 等待厨师来告知有面包了
Desk.lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
// 如果吃货判断有面包,就吃面包
System.out.println("<<<<<<吃货" + Thread.currentThread().getName() + "正在吃堡包>>>>>>>");
// 设置桌上有面包,将true设置为false
Desk.flag = false;
// 告知厨师线程,桌上没有面包了,去生产
Desk.lock.notifyAll();
}
}
}
}
}
/**
* 测试类
*/
public class Test {
public static void main(String[] args) {
// 创建两个厨师(生产者)线程对象
Cooker cooker1 = new Cooker();
Cooker cooker2 = new Cooker();
// 创建两个吃货(消费者)线程对象
Foodies foodies1 = new Foodies();
Foodies foodies2 = new Foodies();
Foodies foodies3 = new Foodies();
Foodies foodies4 = new Foodies();
// 启动它们
cooker1.start();
cooker2.start();
foodies1.start();
foodies2.start();
foodies3.start();
foodies4.start();
}
}
如果生产者、消费者只有一个线程,可以不使用notifyAll()方法,而用notify()方法
总结
这里是对生产者、消费者模式一种简单实现,针对这个线程可以衍生出其他情况,如面包是多个的时候,该怎么判断等等