现在的位置: 首页 > 综合 > 正文

利用LinkedBlockingQueue实现生产者-消费者模式

2013年12月07日 ⁄ 综合 ⁄ 共 2132字 ⁄ 字号 评论关闭

由于LinkedBlockingQueue 实现是线程安全的,实现了先进先出等特性,是作为生产者消费者的首选,LinkedBlockingQueue 可以指定容量,也可以不指定,不指定的话,默认最大是Integer.MAX_VALUE,其中主要用到put和take方法,put方法在队列满的时候会阻塞直到有队列成员被消费,take方法在队列空的时候会阻塞,直到有队列成员被放进来。下面是一个例子,一看就明白了。


package com.spell.designPattern.producer_consumer;

import java.util.UUID;
import java.util.concurrent.BlockingQueue;

/**
* 生产者类,任务是产生个uuid放在队列中
*
* @author Administrator
*
*/
public class Producer implements Runnable {
    private BlockingQueue<String> queue;

    public Producer(BlockingQueue<String> queue) {
        this.queue = queue;
    }

    @Override
    public void run() {
        String uuid = UUID.randomUUID().toString();
        try {
            queue.put(uuid);
            System.out
                    .println(Thread.currentThread() + " produce uuid:" + uuid);
        } catch (InterruptedException e) {
            System.out.println(e.getMessage());
        }

    }

}      

 

package com.spell.designPattern.producer_consumer;

import java.util.concurrent.BlockingQueue;

/**
* 消费者队列,任务是取得队列中的uuid打印下
*
* @author Administrator
*
*/
public class Consumer implements Runnable {
    private BlockingQueue<String> queue;

    public Consumer(BlockingQueue<String> queue) {
        this.queue = queue;
    }

    @Override
    public void run() {
        try {
            String uuid = queue.take();
            System.out
                    .println(Thread.currentThread() + " consume uuid:" + uuid);
        } catch (InterruptedException e) {
            System.out.println(e.getMessage());
        }

    }
}      

 

package com.spell.designPattern.producer_consumer;

import java.util.concurrent.LinkedBlockingQueue;

/**
* 测试类
*
* @author Administrator
*
*/
public class Tester {

    public static void main(String[] args) throws InterruptedException {
        // 队列
        LinkedBlockingQueue<String> queue = new LinkedBlockingQueue<String>(10);
        // 生产者一号
        Producer producer = new Producer(queue);
        // 生产者二号
        Producer producer2 = new Producer(queue);
        // 消费者
        Consumer consumer = new Consumer(queue);

        for (int i = 0; i < 15; i++) {
            new Thread(producer).start();
        }

        for (int i = 0; i < 15; i++) {
            new Thread(producer2).start();
        }

        for (int i = 0; i < 30; i++) {
            new Thread(consumer).start();
        }
    }
}   

抱歉!评论已关闭.