线程通讯: 一个线程完成了自己的任务时,要通知另外一个线程去完成另外一个任务.
生产者与消费者
wait(): 等待 如果线程执行了wait方法,那么该线程会进入等待的状态,等待状态下的线程必须要被其他线程调用notify方法才能唤醒。
notify(): 唤醒 唤醒线程池等待线程其中的一个。
notifyAll() : 唤醒线程池所有等待 线程。
wait与notify方法要注意的事项:
1. wait方法与notify方法是属于Object对象 的。
2. wait方法与notify方法必须要在同步代码块或者是同步函数中才能 使用。
3. wait方法与notify方法必需要由锁对象调用。
[Java] 纯文本查看 复制代码 public class Product {
//名字
String name ;
//价格
double price;
boolean flag = false;
}
[Java] 纯文本查看 复制代码 /*
* 生产者类
*/
class Producer extends Thread {
// 产品
Product p;
public Producer(Product p) {
this.p = p;
}
@Override
public void run() {
// 重写run()
int i = 0;
while (true) {
synchronized(p) {
if (p.flag == false) {
if (i % 2 == 0) {
p.name = "苹果";
p.price = 6.5;
} else {
p.name = "香蕉";
p.price = 2.0;
}
System.out.println("生产者生产出了" + p.name + " : " + p.name + "价格是" + p.price);
p.flag = true;
i++;
p.notifyAll();// 唤醒消费者去消费
} else {
// 已经生产 完毕,等待消费者先去消费
try {
p.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
[Java] 纯文本查看 复制代码 package day_17_duxiancheng;
/*
* 消费者类
*/
public class Customer extends Thread{
Product p;//产品
//构造方法
public Customer(Product p) {
this.p = p;
}
@Override
public void run() {
while(true){
synchronized (p) {
if(p.flag==true){
System.out.println("消费者消费了一个"+p.name+" : "+p.name+"的价格是"+p.price+"元");
p.flag=false;
p.notifyAll();
}else{
//等待生产者生产产品
try {
p.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
} [AppleScript] 纯文本查看 复制代码
public class Tese {
public static void main(String[] args) {
//创建产品对象
Product p = new Product();
//创建生产者对象
Producer producer = new Producer(p);
//创建消费者对象
Customer customer = new Customer(p);
//启动生产者多线程
producer.start();
//启动消费者多线程
customer.start();
}
}
|