黑马程序员技术交流社区

标题: 多线程 线程的通讯(写的不好大家请多多指教) [打印本页]

作者: ab8846254    时间: 2017-7-23 19:04
标题: 多线程 线程的通讯(写的不好大家请多多指教)
线程通讯: 一个线程完成了自己的任务时,要通知另外一个线程去完成另外一个任务.

生产者与消费者


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

        }

}






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2