生产者—消费者问题产生的条件
条件:生产者线程Pp和消费者线程Pc同步,各Pp(Pc)间互斥。
互斥:可以简单理解为,某一公共资源不允许两个及以上并发线程同时访问。
同步:因并发线程各自的执行结果互为对方执行条件(直接制约),使各线程按一定速度执行的过程。
生产者:增加资源,超出最大容量时停止生产,直到小于最大容量再重新开始生产。
消费者:消耗资源,容量为空时停止消耗,直到有了资源再重新开始消耗。
synchronized关键字
简单看一下,加对象锁的方式
synchronized(MyClass.class){
}
这样就给MyClass.class对象加上了一个对象锁。
干嘛要加锁? 我前面写过,生产者-消费者问题产生的条件一个是同步一个是互斥,生产者消费者问题天然满足同步条件,synchronized则为互斥提供条件。
Java代码实现单生产单消费
思路:一个Goods类,创建Goods类列表goods;一个Producer类,一个Consumer类,列表最大空间设为10;空间为10时,Producer线程进入wait(),空间为0时,Consumer线程进入wait()。不管是生产还是消费,都要发送notify()消息。
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
Main m = new Main();
List<Goods> goods = new ArrayList<>();
Thread p = new Thread(m.new Producer(goods));
Thread c = new Thread(m.new Consumer(goods));
p.start();
c.start();
}
class Goods {
}
class Producer implements Runnable {
final int MAX_SIZE = 10;
private List<Goods> goods;
public Producer(List<Goods> goods) {
this.goods = goods;
}
@Override
public void run() {
// TODO Auto-generated method stub
while (true) {
if (MAX_SIZE == goods.size()) {
System.out.println("货架已满");
synchronized (goods) {
try {
goods.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} else {
Goods g = new Goods();
goods.add(g);
System.out.println("生产,货架已有商品:" + goods.size());
synchronized (goods) {
goods.notify();
}
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
class Consumer implements Runnable {
private List<Goods> goods;
public Consumer(List<Goods> goods) {
this.goods = goods;
}
@Override
public void run() {
// TODO Auto-generated method stub
while (true) {
if (goods.size() > 0) {
goods.remove(0);
System.out.println("消费,货架还剩商品:" + goods.size());
synchronized (goods) {
goods.notify();
}
} else {
System.out.println("货架已空");
synchronized (goods) {
try {
goods.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
try {
Thread.sleep(1200);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
欢迎大家交流讨论,有错误还望大家指出,一起进步鸭!vx:iwxid_dezforever66