问题:多线程中有一个比较经典的案例就是生产者和消费者问题.共同操作同一个资源,就是生成的产品,一个生产一个消费,这就必须考虑到线程的安全同步.如何实现多线程中的线程安全,保证资源的统一.
在生产者和消费者问题中,生产者和消费者都是多线程操作.
这里有一个执行生产者和消费者动作的对象,需要对产品有一个判断,判断何时进行生产何时进行消费
/**操作数据*/
class Product{
int num;//产品的数量
//让生产者生产,数量小于20就开始生产
public synchronized void addProduct(){
if (num>=20){
//大于20就不用生产
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}else {
num++;
System.out.println("生产者开始生产第"+ num +"件产品");
notifyAll();//产品数量大于0,可以唤醒当数量小于0时停止的消费线程
}
}
//让消费者消费,只要数量大于0就可以开始消费
//消费动作
public synchronized void reduceProduct(){
if (num>0){
System.out.println("消费者开始消费第"+ num +"件产品");
num--;
notifyAll();//数量大于0表示可以开始消费,在产品数据为20的时候开始减少产品,然后生产者也可以开始生产,所以要唤醒生产者
}else {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
生产者的执行代码:
/**生产者*/
class Producer implements Runnable{
Product product;//引入要操作的对象
public Producer(Product product) {
this.product = product;
}
@Override
public void run() {
while (true){
this.product.addProduct();
}
}
}
消费者的执行代码:
/**消费者*/
class Consumer implements Runnable{
Product product;
public Consumer(Product product) {
this.product = product;
}
@Override
public void run() {
while (true){
this.product.reduceProduct();
}
}
}
以上是以某机构尚**的思路来写的,以下是B站中的狂神的管程法(通过缓冲区来解决)
被共享的产品
/**产品*/
class Clicken{
int id;//编号
public Clicken(int id) {
this.id = id;
}
}
生产者的执行代码
/**生产者*/
class Productor extends Thread{
SynContainer synContainer;
public Productor(SynContainer synContainer){
this.synContainer =synContainer;
}
@Override
public void run