zoukankan      html  css  js  c++  java
  • 线程间的通信

    1.线程间通信的出现场景

       模拟生产者-消费者案例说明:

       生产者生成水果,如果水果没有被买走,那么就不生产处于等待状态,如果水果被消费者买走,这时候消费者就会通知生产者水果已买走请生产,消费者同理,如果水果已经生成出来,那么就买走,买走之后再通知生产者水果没了请生产

    2.线程间通信的实现

      通信规则   (1)线程间的通信共享数据一定要有同步代码块synchronized

           (2)一定要有wait和notify,而且二者一定是成对出现

           (3)生产者和消费者的线程实现一定是在while(true)里边

      案例实现(1)共享资源类(水果篮),代码如下:

    public class Basket {
        
        private boolean isEmpty;
    
        public void setEmpty(boolean empty) {
            isEmpty = empty;
        }
        
        public boolean isEmpty(){
            return isEmpty;
        }
    }
    

      (2)生产者,代码如下:

    public class Producer extends Thread{
    
        private Basket basket;
    
        public Producer(Basket basket){
            super();
            this.basket = basket;
        }
        @Override
        public void run(){
            while (true){
                //定义一个同步代码块
                synchronized (basket){
                    try {
                        if(!basket.isEmpty()){
                            //线程等待状态
                            basket.wait();
                        }
                        System.out.println("生产水果");
                        //通知在这个共享对象上等待的线程
                        basket.setEmpty(false);
                        basket.notify();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
    

      (3)消费者,代码如下:

    public class Consumer extends Thread{
    
        private Basket basket;
    
        public Consumer(Basket basket){
            super();
            this.basket = basket;
        }
        @Override
        public void run(){
            while (true){
                //定义一个同步代码块
                synchronized (basket){
                    try {
                        if(basket.isEmpty()){
                            //线程等待状态
                            basket.wait();
                        }
                        System.out.println("消费水果");
                        //通知在这个共享对象上等待的线程
                        basket.setEmpty(true);
                        basket.notify();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
    

      

      

    当你发现自己的才华撑不起野心时,就请安静下来学习吧
  • 相关阅读:
    世界编程大赛第一名编写的程序3D世界
    bool与BOOL
    防浪涌电路
    用户至上,体验第一
    VC菜菜鸟创建多线程任务HelloWorld
    Google,a good dog
    算法学习之路
    巧用VC工程下的rc文件
    堆与栈
    关于信息量的压缩
  • 原文地址:https://www.cnblogs.com/smallVampire/p/12035226.html
Copyright © 2011-2022 走看看