线程通讯: 一个线程完成了自己的任务时,要通知另外一个线程去完成另外一个任务.
wait(): 等待 如果线程执行了wait方法,那么该线程会进入等待的状态,等待状态下的线程必须要被其他线程调用notify方法才能唤醒。
notify(): 唤醒 唤醒线程池等待线程其中的一个。
notifyAll() : 唤醒线程池所有等待 线程。
wait与notify方法要注意的事项:
1. wait方法与notify方法是属于Object对象 的。 (因为要是指定Thread 类,就没有办法指定任意锁对象了)
2. wait方法与notify方法必须要在同步代码块或者是同步函数中才能 使用。
3. wait方法与notify方法必需要由锁对象调用。
wait():一个线程如果执行了wait()方法,那么该线程就会进去一个以锁对象为标识符的线程池中等待(不同的锁对象,会有不同的锁对象为标识符的线程池)
notify():如果一个线程执行了notify方法,那么就会唤醒以 锁对象为标识符 的线程池中等待线程中的之中一个(不可以指定唤醒那个)
//产品类
class Product{
String name;//名字
double price;//价格
boolean flag=false;//初始时,为false;
}
//生产者
class Producer extends Thread{
Product p;//产品
public Producer(Product p){
this.p=p;
}
public void run(){
int i=0;
while(true){
synchronized (p) {
if(!p.flag){
if(i%2==0){
p.name="苹果";
p.price=2.6;
}else{
p.name="香蕉";
p.price=2;
}
System.out.println("生产者生产出了:"+p.name+" 价格是:"+p.price);
i++;
p.flag=true;
p.notify();
}else{
try {
p.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
}
//消费者
class Consumer extends Thread{
Product p;//产品
public Consumer(Product p){
this.p=p;
}
public void run(){
while(true){
synchronized (p) {
if(p.flag){
System.out.println("消费者消费了:"+p.name+" 价格是:"+p.price);
p.flag=false;
p.notify();
}else{
try {
p.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
}
public class Thread_06 {
public static void main(String[] args) {
Product p=new Product();
Consumer consumer=new Consumer(p);
Producer producer=new Producer(p);
producer.start();
consumer.start();
}
}