Mr.Gao

访客数量

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讲师
......
posted @ 2020-06-17 20:55  gaoliwei1102  阅读(139)  评论(0编辑  收藏  举报