- 建立一个clerk类,用来建立全局变量货物参数。
class clerk {
public static int productNum = 0;
}
2.在class Test3类中创建clerk的对象c,通过new Thread(new Runnable( ) , "线程名称" )建立线程。通过Thread.start( )开启线程。
3.重写Runnable方法,并通过synchronized同步锁避免线程之间的竞争,引入对象c确保只有一个线程访问clerk对象。
4.通过while(true){ }无限循环设置条件, productNum = 0时开始生产,当 productNum < 4 时,productNum++,直到结束while循环。c.notify唤醒等待中的线程。
5.如果 productNum != 0,则生产者线路会进入等待状态,保证只有在货物为0时开启线路。
6.被唤醒的消费者线路开始运行,当 productNum = 0时结束运行,唤醒生产者线路,以此往复。
package day15;
/**
- 生产者与消费者问题
*/
public class Test3 {
public static void main(String[] args) {
clerk c = new clerk();
new Thread(new Runnable() {//生产者
@Override
public void run() {
synchronized (c){ //确保只有一个线程访问clerk对象,避免竞争。
while(true){
if(c.productNum == 0 ){
System.out.println("开始生产" );
while(c.productNum < 4){
c.productNum ++;
System.out.println("当前库存为:" + c.productNum);
System.out.println("结束生产,当前库存为:" + c.productNum);
} c.notify();//唤醒等待中的线程,这里是唤醒消费者线程。
}else{
try {
c.wait();//使当前线程进入等待状态,并释放对象的锁。确保只有在库存等于0时才会进入生产过程。
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
},"生产者").start();
new Thread(new Runnable() { //消费者
@Override
public void run() {
synchronized (c){
while(true){
if(c.productNum == 4){
System.out.println("开始消费,当前库存为:" + c.productNum );
while(c.productNum > 0){
c.productNum --;
System.out.println("当前库存为:" + c.productNum);
}
System.out.println("结束消费,当前库存为:" + c.productNum);
c.notify();
}else{
try {
c.wait();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
},"消费者").start();
}
}
class clerk {
public static int productNum = 0;
}````````