• java线程几个重要概念(wait sleep notify 生产者与消费者)


    Sleep 和 wait

    sleep不会释放锁,而wait会释放锁; 使用区域不用,sleep是哪都能用,wait只能在同步方法或者同步代码块中。

    sleep是Thread调用的, 而wait和notify方法必须是“锁对象”调用的!

    生产者 和 消费者

    //实体类
    public class Baozi {
        String pi;
        String xian;
        boolean flag = false;
    }
    
    
    //主测试类
    public class BaoziMain {
        public static void main(String[] args) {
            Baozi bz = new Baozi();
            BaoziPu bzp = new BaoziPu(bz);
            bzp.start();
    
            ChiHuo ch = new ChiHuo(bz);
            ch.start();
        }
    }

    生产者

    public class BaoziPu extends Thread {
    
        private Baozi bz;
        public BaoziPu(Baozi bz){
            this.bz = bz;
        }
    
        @Override
        public void run() {
    
           while (true){
    
               synchronized (bz){
    
                   if(bz.flag == true){
                       //包子铺进入等待的状态 等待客人吃完包子
                       try {
                           bz.wait(); //注意必须是锁对象来调用wait方法!!!!!!
                       } catch (InterruptedException e) {
                           e.printStackTrace();
                       }
                   }
    
    
    
                   //被唤醒后执行
                   System.out.println("正在生产包子.....");
                   try {
                       Thread.sleep(1000);
                   } catch (InterruptedException e) {
                       e.printStackTrace();
                   }
                   bz.flag = true;
                   System.out.println("赶紧来吃包子吧");
                   bz.notify();
    
               }
    
    
           }
        }
    }

    消费者

    public class ChiHuo extends Thread {
        private Baozi bz;
        public ChiHuo(Baozi bz) {
            this.bz = bz;
        }
    
    
        @Override
        public void run() {
    
            while (true){
    
                synchronized (bz){
    
                    if(bz.flag == false){
                        try {
                            bz.wait(); //注意必须是锁对象来调用wait方法!!!!!!
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
    
    
                    //被唤醒后执行
                    System.out.println("吃货正在吃包子.....");
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
    
                    bz.flag = false;
                    System.out.println("赶紧做包子吧");
                    bz.notify();
    
                }
    
    
            }
        }
    }
    坚持
  • 相关阅读:
    jsp int转String or String转int 方法
    log4j详细使用教程
    SQL 查询当天,本月,本周的记录
    1012Linux流编程的一些知识点
    myeclipse过期以后提示过期以后怎么办?!
    mysql常用命令
    Myeclipse文件没出错,但是项目上显示有错的解决办法
    java的一些命名规范吧
    mysql 按照时间查询
    struts1.x和struts2.x之间的一些区别
  • 原文地址:https://www.cnblogs.com/gaoSJ/p/12836878.html
Copyright © 2020-2023  润新知