zoukankan      html  css  js  c++  java
  • Java多线程的简单应用--生产者与消费者

    Java多线程的简单应用--生产者与消费者

    加入同步、加入等待与唤醒

    代码演示

    package chapter_nine;
    
    //定义商品类:信息
    class Info{
    
        private String name;                //定义信息名称name
        private String content;             //定义信息内容content
        private boolean flag = true;       //定义生产消费标志,flag为false只能进行消费,flag为true只能生产
    
        //setter()和getter()方法
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getContent() {
            return content;
        }
    
        public void setContent(String content) {
            this.content = content;
        }
    
    
        /**
         * 定义同步set()方法, 为信息类Info生产信息
         * 线程执行至此时不能中途被打断
         *
         * @param name
         * @param content
         */
        public synchronized void set(String name, String content){
            if(!flag){                    //若flag为false,生产者暂时无法生产
                try{
                    super.wait();           //需要等待消费者消费
                }catch (Exception e){
                    e.printStackTrace();        //异常处理
                }
            }
            this.setName(name);         //设置信息类的名称
            try{
                Thread.sleep(300);
            }catch (Exception e){
                e.printStackTrace();
            }
            this.setContent(content);       //设置信息类的内容
            System.out.println("生产者生产成功:" + this.getName() + "-->" + this.getContent());
            flag = false;               //将标志位flag置为false,代表商品等待消费者消费
            super.notify();             //唤醒等待的进程
        }
    
    
        /**
         * 消费者进行消费的方法,此为同步方法,线程执行中不能被中断
         */
        public synchronized void get(){
            if(flag){                   //若flag为true的话消费者暂时无法消费
                try{
                    super.wait();       //需等待生产
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
            try{
                Thread.sleep(300);
            }catch (Exception e){
                e.printStackTrace();
            }
            System.out.println("消费者消费成功:" + this.getName() + "-->" + this.getContent());        //进行消费
            flag = true;                //标志位置为true
            super.notify();             //唤醒等待的进程
        }
    
    }
    
    
    //定义生产者类
    class Producer implements Runnable{
    
        private Info info = null;       //定义商品属性
        public Producer(Info info){     //以构造方法将商品传入
            this.info = info;
        }
    
        @Override//覆写run()方法
        public void run() {
            boolean flag = true;       //定义标志,根据标志的不同负责生产的产品
            for(int i = 0; i < 50; i++){
                if (flag){
                    this.info.set("李兴华", "JAVA讲师");     //flag为true生产此种信息商品
                    flag = false;
                }else {
                    this.info.set("mldn","www.mldnjava.cn");        //flag为false生产此种信息商品
                    flag = true;
                }
            }
        }
    }
    
    
    //定义消费者类
    class Consumer implements Runnable{
    
        private Info info = null;       //定义商品
        public Consumer(Info info){         //以构造方法的方式传入商品对象
            this.info = info;
        }
    
        @Override//覆写run()方法
        public void run() {
            for(int i = 0; i < 50; i++){
                try{
                    Thread.sleep(300);
                }catch (Exception e){
                    e.printStackTrace();
                }
                this.info.get();        //进行信息消费
            }
    
        }
    }
    
    public class Pag301 {
        public static void main(String[] args) {
            Info i = new Info();            //实例化信息商品
    
            Producer pro = new Producer(i);         //实例化生产者对象线程
            Consumer consumer = new Consumer(i);    //实例化消费者对象线程
    
            new Thread(pro).start();                //启动生产者线程
            new Thread(consumer).start();           //启动消费者线程
        }
    }
    
    

    运行结果

    生产者生产成功:李兴华-->JAVA讲师
    消费者消费成功:李兴华-->JAVA讲师
    生产者生产成功:mldn-->www.mldnjava.cn
    消费者消费成功:mldn-->www.mldnjava.cn
    生产者生产成功:李兴华-->JAVA讲师
    消费者消费成功:李兴华-->JAVA讲师
    生产者生产成功:mldn-->www.mldnjava.cn
    消费者消费成功:mldn-->www.mldnjava.cn
    生产者生产成功:李兴华-->JAVA讲师
    消费者消费成功:李兴华-->JAVA讲师
    ......
    
  • 相关阅读:
    IE8使用chrome内核渲染
    JS中的call()方法和apply()方法用法总结(挺好 转载下)
    解决雷达图文字显示不全问题
    echarts legend文字配置多个颜色(转)
    vue中Axios的封装和API接口的管理
    echarts 折线拐点收藏
    echarts 折线图自定义颜色与修改legend颜色
    MUI框架 按钮点击响应不好的问题解决办法
    ECharts将折线变平滑和去掉点的属性
    单例模式——创建型模式01
  • 原文地址:https://www.cnblogs.com/gaoliwei1102/p/13154669.html
Copyright © 2011-2022 走看看