当前位置:首页 > 开发 > 编程语言 > 编程 > 正文

生产者消费者 BlockingQueue 实现

发表于: 2014-04-08   作者:abc08010051   来源:转载   浏览:
摘要: BlockingQueue是一个线程安全的队列,本身的部分方法实现了线程之间的调度,实现生产者消费者非常方便,比synchronized,wait更容易控制,不过看BlockingQueue的实现类ArrayBlockingQueue的源码,主要还是使用Lock和条件变量Condition来实现,足以见的Lock的灵活和强大,下面是我写的实现: import java.util.concurre

BlockingQueue是一个线程安全的队列,本身的部分方法实现了线程之间的调度,实现生产者消费者非常方便,比synchronized,wait更容易控制,不过看BlockingQueue的实现类ArrayBlockingQueue的源码,主要还是使用Lock和条件变量Condition来实现,足以见的Lock的灵活和强大,下面是我写的实现:

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;

/**
 * Created by Administrator on 14-4-8.
 */
public class BlockingQueueDemo {

    public static void main (String[] args) {
        BlockingQueue blockingQueue = new ArrayBlockingQueue(GodOwn.MAX_SIZE);
        GodOwn godOwn = new GodOwn(blockingQueue);
        for (int i = 0; i < 10; i++) {
            new Producer(godOwn).start();
        }

        for (int i = 0; i < 10; i++) {
            new Reducer(godOwn).start();
        }
    }

}

class GodOwn {

    /**
     * 仓库能盛放馒头最大数量
     */
    public static final int MAX_SIZE = 3;

    private BlockingQueue<Mantou> blockingQueue;

    GodOwn (BlockingQueue<Mantou> blockingQueue) {
        this.blockingQueue = blockingQueue;
    }

    public void produce () throws InterruptedException {
        Mantou mantou = new Mantou();
        blockingQueue.put(mantou);
        System.out.println("生产了一个,仓库还有" + blockingQueue.size());
    }

    public void reduce () throws InterruptedException {
        blockingQueue.take();
        System.out.println("消费了一个,仓库还有" + blockingQueue.size());
    }

}

/**
 * 消费者
 */
class Producer extends Thread {
    private GodOwn godOwn;

    Producer (GodOwn godOwn) {
        this.godOwn = godOwn;
    }

    public void run () {
        try {
            godOwn.produce();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

/**
 * 消费者
 */
class Reducer extends Thread {
    private GodOwn godOwn;

    Reducer (GodOwn godOwn) {
        this.godOwn = godOwn;
    }

    public void run () {
        try {
            godOwn.reduce();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

/**
 * 馒头
 */
class Mantou {
}

 

生产者消费者 BlockingQueue 实现

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
原来写过一个....我都忘记了.. http://fair-jm.iteye.com/blog/1894288 以上这个不对啊..看了下和所
Java 语言实现生产者 -- 消费者模式,本文采用1个生产者和3个消费者,以体现多线程并发过程中应该注
题目如下: 在生产者/消费者模型中,生产者Producer负责生产数据,而消费者Consumer负责使用数据。
在操作系统中有一类问题被称为生产者消费者问题:意为,有数个生产者生产产品,有数个消费者消费产
线程并发的生产者-消费者模型: 1.两个进程对同一个内存资源进行操作,一个是生产者,一个是消费者
在生产者/消费者模型中,生产者Producer负责生产数据,而消费者Consumer负责使用数据。多个生产者
题目如下: 在生产者/消费者模型中,生产者Producer负责生产数据,而消费者Consumer负责使用数据。
(1)线程同步,实现“生产者消费者问题” 要求:缓冲区大小为20,生产者每次放一个产品,消费者每
生产者消费者编程实现,采用了线程池以及信号量技术。 线程的概念就不多说,首先说一下多线程的好处
java线程的生命周期 /** * 公共资源类 */ public class PublicResource { private int number = 0;
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号