`
wlh269
  • 浏览: 457868 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

阻塞队列

    博客分类:
  • J2SE
阅读更多
ArrayBlockingQueue为阻塞队列,加入和取出元素都是阻塞的!构造方法提供队列的长度
例1:
package org.test.concurrent;

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

public class BlockingQueueTest {
    /** *//**
     * 定义装苹果的篮子
     */
    public static class Basket{
        // 篮子,能够容纳3个苹果
        BlockingQueue<String> basket = new ArrayBlockingQueue<String>(3);
        
        // 生产苹果,放入篮子
        public void produce() throws InterruptedException{
            // put方法放入一个苹果,若basket满了,等到basket有位置
            basket.put("An apple");
        }
        // 消费苹果,从篮子中取走
        public String consume() throws InterruptedException{
            // get方法取出一个苹果,若basket为空,等到basket有苹果为止
            return basket.take();
        }
    }
    // 测试方法
    public static void testBasket() {
        // 建立一个装苹果的篮子
        final Basket basket = new Basket();
        // 定义苹果生产者
        class Producer implements Runnable {
            public void run() {
                try {
                    while (true) {
                        // 生产苹果
//                        System.out.println("生产者准备生产苹果:"+ System.currentTimeMillis());
                        basket.produce();
                        System.out.println("生产者生产苹果完毕:" +System.currentTimeMillis()+"篮子里有多少苹果:"+basket.basket.size());
                        // 休眠300ms
                        Thread.sleep(300);
                    }
                } catch (InterruptedException ex) {
                }
            }
        }
        // 定义苹果消费者
        class Consumer implements Runnable {
            public void run() {
                try {
                    while (true) {
                        // 消费苹果
                        /*System.out.println("消费者准备消费苹果:" 
                                + System.currentTimeMillis());*/
                        basket.consume();
                        System.out.println("消费者消费苹果完毕:" 
                                + System.currentTimeMillis()+"篮子里有多少苹果:"+basket.basket.size());
                        // 休眠1000ms
                        Thread.sleep(1000);
                    }
                } catch (InterruptedException ex) {
                }
            }
        }
        
        ExecutorService service = Executors.newCachedThreadPool();
        Producer producer = new Producer();
        Consumer consumer = new Consumer();
        service.submit(producer);
        service.submit(consumer);
        // 程序运行5s后,所有任务停止
       // service.shutdownNow();
    }

    public static void main(String[] args) {
        BlockingQueueTest.testBasket();
    }
}


例2:
 package org.test.concurrent;

package com.hollyinfo.cuibao.biz;

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

import com.hollyinfo.cuibao.logger.HollyinfoLog;
import com.hollyinfo.cuibao.logger.HollyinfoLogger;
import com.hollyinfo.cuibao.model.Basket;
import com.hollyinfo.cuibao.util.SystemParameter;
import com.hollyinfo.cuibao.webservice.LogServer;
public class BlockingQueueBiz   {
	private static final HollyinfoLog LOG = HollyinfoLogger.getLog(LogServer.class);
	private static final long serialVersionUID = 1L;
      //私有的静态的实例   
	   public Basket basket=null;
	   private static BlockingQueueBiz instance = new BlockingQueueBiz();   
	   //私有的构造方法   
	   private BlockingQueueBiz() {
		   basket= Basket.getInstance();
			process();
	   }
	   //公有静态的访问接口,返回当前类的实例   
	   public static BlockingQueueBiz getInstance() {   
	       return instance;   
	   }
	   
      public  void process() {
    	  
    	class Producer implements Runnable {
            public void run() {
            	 while (true) {
                try {
                     basket.produce("ss");
                     Thread.sleep(1000);
                } catch (Exception ex) {
                	ex.printStackTrace();
                }
            	 }
            }
        }
        
        
        class Consumer implements Runnable {
            public void run() {
            	 while (true) {
                try {
                        String p2=basket.consume();
                        LogBizImpl.getInstance().SynchLog(SystemParameter.lua_path, p2);
                        Thread.sleep(1000);
	                } catch (Exception ex) {
	                	ex.printStackTrace();
	                }
	                catch (Error ex) {
	                	ex.printStackTrace();
	                }
	            }
            }
        }
    	
        ExecutorService service = Executors.newCachedThreadPool();
        Consumer consumer = new Consumer();
        service.submit(consumer);
        Consumer produce = new Consumer();
        service.submit(produce);
        //service.shutdownNow();
    }
}

分享到:
评论

相关推荐

    支持多线程和泛型的阻塞队列

    阻塞队列是一种在多线程编程中广泛使用的并发数据结构,它在计算机科学和编程领域,特别是Java和C++等面向对象语言中扮演着重要角色。标题中的“支持多线程和泛型的阻塞队列”意味着我们讨论的是一个能够同时处理多...

    java模拟阻塞队列

    Java中的阻塞队列是一种基于同步原语的高级数据结构,它在多线程编程中扮演着重要角色,尤其在并发处理和优化系统资源利用率方面。阻塞队列结合了队列的数据结构与线程同步机制,使得生产者可以在队列满时被阻塞,而...

    阻塞队列阻塞队列阻塞队列

    在Java编程语言中,阻塞队列是一种线程安全的数据结构,它在多线程并发控制中发挥着重要作用。阻塞队列的核心特性是当队列为空时,尝试获取元素的线程会被阻塞,直到其他线程添加元素;同样,当队列满时,试图插入...

    并发-线程池和阻塞队列.pdf

    线程池和阻塞队列是实现并发的关键组件之一。本文将详细介绍线程池原理、使用场景及注意事项,以及阻塞队列的相关知识。 首先,线程池是一种基于池化思想管理线程的技术,它可以重用一组线程执行多个任务。线程池的...

    c++11 实现的阻塞队列

    C++11 实现的阻塞队列 C++11 中的阻塞队列是指在多线程环境下,实现生产者消费者模式的队列。阻塞队列的实现需要解决两个问题:线程安全和阻塞机制。在 C++11 中,我们可以使用 std::mutex、std::condition_...

    14-阻塞队列BlockingQueue实战及其原理分析二.pdf

    阻塞队列(BlockingQueue)是一种特殊的队列,它支持两个附加操作:阻塞的插入方法put和阻塞的移除方法take。BlockingQueue继承了Queue接口,是Java 5中加入的。 BlockingQueue常用方法示例: 1. add(E e):添加一...

    BlockingQueue(阻塞队列)详解

    ### BlockingQueue(阻塞队列)详解 #### 一、前言 随着现代软件系统对并发性能需求的不断提高,多线程编程技术逐渐成为开发人员不可或缺的技能之一。在Java平台中,`java.util.concurrent`包提供了丰富的工具来...

    Java实现简单的阻塞队列2种方式

    在Java编程中,阻塞队列是一种特殊类型的并发数据结构,它在多线程环境中的应用广泛,主要用于线程间的协作通信。阻塞队列在队列满时会阻止生产者线程添加元素,在队列空时会阻止消费者线程取出元素,直到条件满足...

    生产者/消费者模式 阻塞队列 LinkedBlockingQueue

    在Java中,阻塞队列(BlockingQueue)是一个很好的实现生产者/消费者模式的工具,而LinkedBlockingQueue则是Java并发包(java.util.concurrent)中提供的一个具体实现。 LinkedBlockingQueue是一个基于链表结构的...

    并发-线程池和阻塞队列

    在Java编程中,"并发-线程池和阻塞队列"是两个核心概念,它们在多线程环境下处理任务调度和数据同步方面发挥着重要作用。线程池是一种管理线程资源的有效方式,而阻塞队列则常用于线程间通信和数据共享。 线程池...

    10、阻塞队列BlockingQueue实战及其原理分析.pdf

    ### 10、阻塞队列BlockingQueue 实战及其原理分析 #### 一、阻塞队列概述 阻塞队列(BlockingQueue)是Java语言中`java.util.concurrent`包下提供的一种重要的线程安全队列。它继承自`Queue`接口,并在此基础上...

    阻塞队列(Blocking Queue)是一个支持两个附加操作的队列.txt

    阻塞队列是Java中并发编程的一个重要组件,它属于Java.util.concurrent包中的一部分。阻塞队列的主要特点在于它支持两个额外的条件操作:当队列为空时,尝试从队列中取元素的操作会被阻塞,直到队列中出现新的元素;...

    java线程聊天室(阻塞队列实现)

    【Java线程聊天室(阻塞队列实现)】 在Java编程中,多线程是构建并发应用程序的关键技术。在创建一个线程聊天室时,我们通常会涉及到多个线程之间的交互,例如用户发送消息、接收消息以及处理网络通信等。而阻塞...

    10、阻塞队列BlockingQueue实战及其原理分析

    阻塞队列BlockingQueue是Java并发编程中一个重要的数据结构,它是线程安全的队列,主要用于生产者消费者模型中的数据交换。在Java的`java.util.concurrent`包中,提供了多种实现阻塞队列的类,如`ArrayBlockingQueue...

    高性能阻塞队列的数据结构创新.pptx

    ### 高性能阻塞队列的数据结构创新 #### 一、阻塞队列的概念与应用 **阻塞队列**是一种特殊的队列,它具备线程安全的特点,并且当队列为空时,从队列中获取元素的操作会被阻塞;同样地,当队列满时,向队列中添加...

    Java并发编程(21)并发新特性-阻塞队列和阻塞栈(含代

    在Java并发编程中,阻塞队列和阻塞栈是两个重要的并发数据结构,它们在多线程环境下的高效通信和资源管理中扮演着至关重要的角色。这些数据结构源自Java的并发包`java.util.concurrent`,是实现并发设计模式如生产者...

    阻塞队列实现生产者消费者模式Java开发Java经验技巧共

    在这个场景中,阻塞队列(BlockingQueue)是实现这种模式的理想工具,因为它提供了线程安全的数据同步机制。 阻塞队列在Java中的实现主要由`java.util.concurrent`包下的几个类提供,如`ArrayBlockingQueue`、`...

    java阻塞队列实现原理及实例解析.docx

    Java 阻塞队列(Blocking Queue)是一种特殊类型的并发数据结构,它在多线程编程中扮演着重要的角色。阻塞队列的核心特性在于其在队列为空或满时能够自动阻塞线程,从而实现线程间的同步和通信。这种机制使得生产者...

    剖析Java中阻塞队列的实现原理及应用场景

    Java中的阻塞队列是一种特殊的线程安全的数据结构,它在多线程环境下用于高效地处理生产者-消费者问题。阻塞队列的核心特性在于当队列为空时,尝试获取元素的线程会被阻塞,直到队列中有元素可用;同样,当队列满时...

    java学习(基于Java阻塞队列的搜索实例).pdf

    在这篇文档中,我们将详细探讨Java中基于阻塞队列的搜索实例。Java的并发API为我们提供了强大的线程间通信工具,而阻塞队列是这些工具中的核心组件之一。阻塞队列是一个支持两个附加操作的队列:在队列为空时,获取...

Global site tag (gtag.js) - Google Analytics