zoukankan      html  css  js  c++  java
  • java基础26 线程的通讯;wait()、notify()、notifyAll()等方法

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

    1.1、方法

      wait():等待。如果线程执行到了wait()方法,那么该线程会进入等待状态,等待状态下的线程必须要被其他线程调用notify()方法才能唤醒.
      notify():唤醒。唤醒线程池等待的其中一条线程
      notifyAll():唤醒线程池中所等待的线程

    1.2、wait与notyify的方法注意的事项

        1. wait方法与notify方法是属于Object对象的
        2.wait与notify方法必须要在同步代码块或者同步函数中才能使用
        3.wait方法与notify的方法必须由锁对象调用

    1.3、实例

     1 package com.zn.thread;
     2 
     3 /**
     4  * @author DSHORE / 2018-5-11
     5  *
     6  */
     7 /*
     8  * 线程的通讯:一个线程完成了自己的任务时,要通知另一个线程去完成另一个任务
     9  * 
    10  * 生产者与消费者
    11  * 
    12  * */
    13 //产品
    14 class Product{
    15     String name;//产品名字
    16     double price;//价格
    17     boolean flag=false;//生产者是否生产完成的标志,默认是没有生产完成    
    18 }
    19 //生产者
    20 class Producer extends Thread{    
    21     Product p;
    22     public  Producer(Product p) {
    23         this.p=p;
    24     }
    25     @Override
    26     public void run() {
    27         int i=0;
    28         while(true){
    29             synchronized (p) {
    30                 if(p.flag==false){
    31                     if(i%2==0){
    32                         p.name="苹果";
    33                         p.price=5.0;
    34                     }else{
    35                         p.name="香蕉";
    36                         p.price=3.5;
    37                     }
    38                     System.out.println("生存者生产出了:"+p.name+"; 价格是:"+p.price);
    39                     p.flag=true;//flag为true时,通知消费者去消费
    40                     i++;
    41                     p.notify();//唤醒 消费者去消费
    42                 }else{
    43                     try {
    44                         p.wait();//生产者等待
    45                     } catch (InterruptedException e) {
    46                         e.printStackTrace();//打印异常信息
    47                     }
    48                 }
    49             }
    50         }
    51     }
    52 }
    53 //消费者
    54 class Customer extends Thread{
    55     Product p;
    56     public Customer(Product p) {
    57         this.p=p;
    58     }
    59     @Override
    60     public void run() {
    61         while(true){
    62             synchronized (p) {    
    63                 if(p.flag==true){                
    64                     System.out.println("消费者消费了:"+p.name+"; 价格:"+p.price);            
    65                     p.flag=false;//flag为false时,通知生产者去生产
    66                     p.notify();//唤醒 生产者去生产
    67                 }else{
    68                     try {
    69                         p.wait();//消费者也等待了
    70                     } catch (InterruptedException e) {
    71                         e.printStackTrace();//打印异常信息
    72                     }
    73                 }
    74             
    75             }
    76         }
    77     }
    78 }
    79 public class Demo5 {
    80     public static void main(String[] args) {
    81         Product p=new Product();
    82         //创建线程对象
    83         Producer producer=new Producer(p);
    84         Customer customer=new Customer(p);
    85         //开启线程
    86         producer.start();
    87         customer.start();
    88     }
    89 }

    运行结果图

    原创作者:DSHORE

    作者主页:http://www.cnblogs.com/dshore123/

    原文出自:http://www.cnblogs.com/dshore123/p/9010165.html

    欢迎转载,转载务必说明出处。(如果本文对您有帮助,可以点击一下右下角的 推荐,或评论,谢谢!

  • 相关阅读:
    网页效果图设计之色彩索引
    支持树型的GridView控件
    (转)CSS布局参考 IE的If条件注释使用备忘
    firefox与IE对javascript和CSS的区别
    转 CSS半透明滤镜在FIREFOX和IE下面的能够通用的写法
    無法為 SSL/TLS 安全通道建立信任關係,忽略憑証檢查的方式
    临时
    EventUtil
    js测试对象包含特性
    重学概率论的一点点理解(持续更新)
  • 原文地址:https://www.cnblogs.com/dshore123/p/9010165.html
Copyright © 2011-2022 走看看