线程的通讯

线程通讯: 一个线程完成了自己的任务时,要通知另外一个线程去完成另外一个任务.

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();
    }
}

你可能感兴趣的:(线程的通讯)