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讲师
    ......
    
  • 相关阅读:
    字符编码相关
    函数之形参与实参
    文件操作模式
    函数对象,名称空间,作用域,和闭包
    吴裕雄天生自然SPRINGBOOT开发实战处理'spring.datasource.url' is not specified and no embedded datasource could be autoconfigured
    吴裕雄天生自然SPRINGBOOT开发实战处理XXXX that could not be found.
    吴裕雄天生自然SPRINGBOOT开发实战SpringBoot HTML表单登录
    吴裕雄天生自然SPRINGBOOT开发实战SpringBoot REST示例
    吴裕雄天生自然SpringBoot开发实战学习笔记处理 Could not write metadata for '/Servers'.metadata\.plugins\org.eclipse.core.resources\.projects\Servers\.markers.snap (系统找不到指定的路径。)
    吴裕雄天生自然SPRINGBOOT开发实战SpringBoot Tomcat部署
  • 原文地址:https://www.cnblogs.com/gaoliwei1102/p/13154669.html
Copyright © 2011-2022 走看看