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

JDK1.5 生产消费者

发表于: 2013-05-21   作者:bijian1013   来源:转载   浏览:
摘要: ArrayBlockingQueue:        一个由数组支持的有界阻塞队列。此队列按 FIFO(先进先出)原则对元素进行排序。队列的头部 是在队列中存在时间最长的元素。队列的尾部 是在队列中存在时间最短的元素。新元素插入到队列的尾部,队列检索操作则是从队列头部开始获得元素。 ArrayBlockingQueue的常用方法:

ArrayBlockingQueue

       一个由数组支持的有界阻塞队列。此队列按 FIFO(先进先出)原则对元素进行排序。队列的头部 是在队列中存在时间最长的元素。队列的尾部 是在队列中存在时间最短的元素。新元素插入到队列的尾部,队列检索操作则是从队列头部开始获得元素。

ArrayBlockingQueue的常用方法:

       put:将指定的元素添加到此队列的尾部,如果必要,将等待可用的空间。

       take:检索并移除此队列的头部,如果此队列不存在任何元素,则一直等待。

       offer:将指定的元素插入到此队列的尾部(如果可能),如果此队列已满,则立即返回。

       poll:检索并移除此队列的头,如果此队列为空,则返回null

说明:putoffer都是向队列中添加元素,takepoll都是从队列中移除元素。puttake对应一组,是阻塞式的;offerpoll对应一组,是非阻塞式的。

 

实例:

package com.bijian.thread;

import java.util.concurrent.BlockingQueue;

public class Producer implements Runnable {

	private String name = null;
	private BlockingQueue<String> queue = null;

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

	@Override
	public void run() {

		try {
			for (int i = 0; i < 10; i++) {
				queue.put(name + ": " + i);
				System.out.println("Product:" + name + ": " + i);
				Thread.sleep((long) (Math.random() * 1000));
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

 

package com.bijian.thread;

import java.util.concurrent.BlockingQueue;

public class Consumer implements Runnable {
	
	private String name;
	private BlockingQueue<String> queue = null;
	
	public Consumer(String name, BlockingQueue<String> queue) {
		this.name = name;
		this.queue = queue;
	}

	@Override
	public void run() {
		
		try {
			for (int i = 0; i < 5; i++) {
				String prod = queue.take();
				System.out.println("Consumer:" + name + ": " + prod);
				Thread.sleep((long) (Math.random() * 1000));
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

 

package com.bijian.thread;

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

public class Main {

	public static void main(String[] args) {
		
		BlockingQueue<String> queue = new ArrayBlockingQueue<String> (3);
		
		ExecutorService service = Executors.newCachedThreadPool();    
	    Producer producer = new Producer("P1", queue);
	    Consumer consumer = new Consumer("C1", queue);
	    Consumer consumer1 = new Consumer("C2", queue);
	    service.execute(producer);
	    service.execute(consumer);
	    service.execute(consumer1);
	    service.shutdown();    
	}
}

 

运行结果:
Product:P1: 0
Consumer:C1: P1: 0
Product:P1: 1
Consumer:C2: P1: 1
Product:P1: 2
Consumer:C1: P1: 2
Product:P1: 3
Consumer:C2: P1: 3
Product:P1: 4
Consumer:C1: P1: 4
Product:P1: 5
Consumer:C2: P1: 5
Product:P1: 6
Consumer:C1: P1: 6
Product:P1: 7
Consumer:C2: P1: 7
Product:P1: 8
Product:P1: 9
Consumer:C1: P1: 8
Consumer:C2: P1: 9

 

JDK1.5 生产消费者

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
生产消费者模型 基本概念: 生产消费者模型,就是存在两个线程,一个线程需要产生数据放入队列中,
生产者-消费者问题 a. 在多线程程序中,可能出现生产者-消费者问题,即等待同步数据的问题 b. 可能
生产者-消费者问题 a. 在多线程程序中,可能出现生产者-消费者问题,即等待同步数据的问题 b. 可能
对于同步代码块,对于锁的操作是隐式的 但是在JDK1.5之前的这种方法效率有点低,判断会很多,后面升
百科名片 消费者心理 指消费者在购买和消费商品过程中的心理活动。一般是:先接触商品,引起注意;
JDK1.5 Lock实例 Executors类主要方法: a. static ExecutorService newCachedThreadPool() 产生一
Executors类主要方法: a. static ExecutorService newCachedThreadPool() 产生一个ExecutorService
JDK1.5 Lock实例 Executors类主要方法: a. static ExecutorService newCachedThreadPool() 产生一
Executors类主要方法: a. static ExecutorService newCachedThreadPool() 产生一个ExecutorService
1 关于读写锁的一些特点: a) 读写锁是JVM自己控制的,我们只要上相应方法上加锁即可 b) 多个读锁共
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号