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

      

      

    当你发现自己的才华撑不起野心时,就请安静下来学习吧
  • 相关阅读:
    DIV+CSS—菜鸟分享学习心得!入门篇
    有关 JavaScript 的 10 件让人费解的事情
    [论离职]走的人不少,来的人更多
    面朝电脑,春暖花开
    职场小说:《米亚快跑》PDF版下载
    flex和html的对比
    10个可以简化开发过程的MySQL工具
    转:大型网站架构不得不考虑的10个问题
    怎样善用色彩层次?40个精彩站点给你灵感
    50个令人耳目一新的网页纹理设计
  • 原文地址:https://www.cnblogs.com/smallVampire/p/12035226.html
Copyright © 2011-2022 走看看