Java多线程五:生产者和消费者模型(单个对单个)

来源:互联网 发布:python ftp 下载文件 编辑:程序博客网 时间:2024/06/05 07:50

多线程协同任务之:生产者和消费者模型

介绍

在上一篇中介绍了多线程的等待和唤醒机制,这一篇我们就实践一下,单个生成这和单个消费模型。假如有一个资源类Resouce,其有一个属性name属性和我们赋予的一个标识为flag属性。 现在通过启动多线程(其实就是两个线程生产线程和消费线程),来达到一边赋值一边取值打印的效果。

Resource类定义

public class Resource {    /** 标识位 */    private boolean flag = false;    /** 资源名称 */    private String name;    //setter和getter方法    ...}

ProductThread线程类

public class ProductThread implements Runnable {    /** 资源对象 */    private Resource resource;    public ProductThread(Resource resource) {        this.resource = resource;    }    @Override    public void run() {        int count = 0;        while (true) {            synchronized (resource) {                if (resource.isFlag()) {// 如果有产品这个线程就放弃执行权                    try {                        resource.wait();                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                } else {// 如果没有产品就生产,生产完之后通知消费者                    count++;                    resource.setName("产品" + count);                    System.out.println("生产者 product:" + resource.getName());                    resource.setFlag(true);                    resource.notify();                }            }        }    }}

ConsumeThread线程类

public class ConsumeThread implements Runnable {    /** 资源对象*/    private Resource resource;    public ConsumeThread(Resource resource) {        this.resource = resource;    }    @Override    public void run() {        while (true) {            synchronized (resource) {                if (resource.isFlag()) {// 如果有产品,就直接消费。消费完之后通知生产线程                    System.out.println("消费者consume:" + resource.getName());                    resource.setFlag(false);                    resource.notify();                } else {// 如果没有产品,就等待生产者生产产品                    try {                        resource.wait();                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                }            }        }    }}

执行结果

main方法

public static void main(String[] args) {    Resource resource = new Resource();    //生产者线程    ProductThread productThread = new ProductThread(resource);    //消费者线程    ConsumeThread consumeThread = new ConsumeThread(resource);    new Thread(productThread).start();    new Thread(consumeThread).start();}

交替执行

总结

最容易弄错的地方就是,什么时候调用wait方法什么时候调用notify方法,这一点确实不好说。通常是当这一边的线程不用执行任何代码时,那么久调用wait方法,放弃执行权,如果当这边修改了某标识位之后, 想让对方执行那么久执行notify方法。这么说还是显得比较抽象,暂时还没想到比较简单的说法,还是和应用场景有关,很难总结。
0 0
原创粉丝点击