wait() , notify() notifyAll() 生产者,消费者模式
package Day08;
public class Test生产者消费者 {
public static void main(String[] args) {
sc a = new sc("生产员1号"); //这里就是调用 有参构造,设置线程的名称
//new sc("生产员2号").start(); //这里我想多加入几条线程去看看效果
a.start();
xf b = new xf("消费者1号");
b.start();
//new xf("消费者1号").start(); //这里我想多加入几条线程去看看效果
}
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
}
class sc extends Thread{
public sc(String name){ //这里写一个有参的构造方法,是为了在创建线程的时候给线程起名字
super(name);
}
static String value = "";
//我这里是用一个字符串来判断是否为空,(空代表没有产品,生产者需要工作启动线程,不为空 生产者要休息(等待) , 消费者线程执行 购买)
//如果需要直观一点可以直接定义一个Boolean 类型的变量 static boolean b = false;
@Override
public void run() {
while(true){
try {
synchronized (Test生产者消费者.class) {
while (!value.equals("")) {
// 数据集不为空,那么生产者要休息
System.out.println(Thread.currentThread().getName() + " -----休息");
Test生产者消费者.class.wait();
}
//如果为空 就要去生产(也就是说要启动 生产者线程)
System.out.println(Thread.currentThread().getName() + "------生产");
//生产完产品 然后把value 赋值为不为空 之后就是唤醒其他线程(消费者线程),
value ="_";
Test生产者消费者.class.notifyAll();
}
} catch (Exception e) {
// TODO: handle exception
}
}
}
}
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
class xf extends Thread{
public xf(String name){ //这里写一个有参的构造方法,是为了在创建线程的时候给线程起名字
super(name);
}
@Override
public void run() {
while(true){
try {
synchronized (Test生产者消费者.class) {
while (sc.value.equals("")) {
System.out.println(Thread.currentThread().getName() + "-----等待");
Test生产者消费者.class.wait();
}
System.out.println(Thread.currentThread().getName() + "---- 购买");
sc.value = "";
Test生产者消费者.class.notifyAll();
}
} catch (Exception e) {
// TODO: handle exception
}
}
}
}