`

队列容器

 
阅读更多
package com.bjsxt.base.coll013;

import java.util.concurrent.SynchronousQueue;


/**
ConcurrentLinkedQueue : 先进先出高并发队列。无锁、无阻塞。不允许null元素。
先进在头,后进在尾。
 方法  :add( )、 offer() 、Poll()从头部取出元素,并删除、
       peek()从头部取出元素,不删除。
BlockingQueue 接口:  阻塞队列
	ArrayBlockingQueue  :  不支持并发,低效。有长度限制,并且阻塞,无读写分离(意味着生产和消费不能同时进行)
	LinkedBlockingQueue :  支持并发操作,高效。基于链表的阻塞队列,高效的处理并发数据,无长度限制,内部实现读写分离锁,
	                                                          从而实现生产者和消费者操作完全并行运行。
	SynchronousQueue    :  一种没有缓冲的队列,生成一个消费一个,没有第二个了。
 *
 */
public class UseQueue {

	public static void main(String[] args) throws Exception {
		
		//高性能无阻塞无界队列:ConcurrentLinkedQueue
		//先进先出高并发队列。无锁、无阻塞。不允许null元素。
/*		ConcurrentLinkedQueue<String> q = new ConcurrentLinkedQueue<String>();
		q.offer("a");
		q.offer("b");
		q.offer("c");
		q.offer("d");
		q.add("e");
		
		System.out.println(q.poll());	//a 从头部取出元素,并从队列里删除
		System.out.println(q.size());	//4
		System.out.println(q.peek());	//b   不移除,一下次peek 依然是这个b
		System.out.println(q.size());	//4
*/		
		/*ArrayBlockingQueue<String> array = new ArrayBlockingQueue<String>(5);
		array.put("a");
		array.put("b");
		array.add("c");
		array.add("d");
		array.add("e");
		array.add("f");
		System.out.println(array.offer("a", 3, TimeUnit.SECONDS));*///等待3秒,如果加入不成功就抛异常。
		
		
		
		
		//阻塞队列
		//支持并发操作,高效。基于链表的阻塞队列,高效的处理并发数据,无长度限制,内部实现读写分离锁,
        //从而实现生产者和消费者操作完全并行运行。
/*		LinkedBlockingQueue<String> q = new LinkedBlockingQueue<String>();
		q.offer("a");
		q.offer("b");
		q.offer("c");
		q.offer("d");
		q.offer("e");
		q.add("f");
		//System.out.println(q.size());
		
		for (Iterator iterator = q.iterator(); iterator.hasNext();) {
			String string = (String) iterator.next();
			System.out.println(string);
		}
		System.out.println("---------------------------------");
		List<String> list = new ArrayList<String>();
		System.out.println(q.drainTo(list, 3));
		System.out.println(list.size());
		for (String string : list) {
			System.out.println(string);
		}*/
		
		
		
		final SynchronousQueue<String> q = new SynchronousQueue<String>();
		Thread t1 = new Thread(new Runnable() {
			@Override
			public void run() {
				try {
					System.out.println(q.take());
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		});
		t1.start();
		Thread.sleep(100);
		Thread t2 = new Thread(new Runnable() {
			
			@Override
			public void run() {
				try {
					q.put("ddd");
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
			}
		});
		t2.start();		
	}
}

 

分享到:
评论

相关推荐

    线程安全队列容器FailoverQueue.zip

    FailoverQueue 提供一个线程安全的类似队列的容器,它能将队列内容溢出到 failover 文件中以供后续再处理。这允许队列固定在一定尺寸中,并且定期将溢出内容写入文件中,这样在队列只有少部分内容时就可以重新阅读...

    C++容器与队列

    ### C++ 容器与队列详解 #### 一、引言 在现代软件开发过程中,C++ 作为一种高效且灵活的编程语言被广泛应用。在 C++ 的标准库(Standard Template Library, STL)中,提供了丰富的容器类和算法,极大地提高了程序...

    P213~214C++queue容器学习笔记.docx

    队列容器允许从一端新增元素,从另一端移除元素。队列中只有队头和队尾才能被外界使用,因此队列不允许有遍历行为。 队列容器常用接口 队列容器的常用接口包括: 1. 构造函数:`queue&lt;T&gt; que;`,创建一个空队列...

    双端队列C++实现 双端队列C++实现

    在C++标准库中,`std::deque`是内置的双端队列容器,提供了高效且灵活的内存管理。然而,如果你想要自定义一个双端队列,我们可以从头开始探讨如何实现。 自定义双端队列的基本思想是使用动态数组或链表作为底层...

    【源代码】C++算法(四)队列的基本操作 (用队列实现十进制转换十六进制)

    在C++中,虽然标准库并没有直接提供队列容器,但我们可以通过结合`std::deque`(双端队列)或者`std::queue`(基于其他容器的队列)来实现。`std::queue`通常使用`std::vector`或`std::deque`作为底层容器,它提供了...

    列表队列应用

    - **`deque&lt;int&gt;`**:双端队列容器,可以在两端高效地插入或删除元素。 - **`list&lt;int&gt;`**:双向链表容器,插入和删除操作非常快,因为它只需要修改指针即可完成操作。 - **`template&lt;class T&gt;`**:模板函数,允许...

    C++之STL标准库容器成员一览表.pdf

    * deque:一个双端队列容器,元素类型可以是任何类型。 * list:一个双向链表容器,元素类型可以是任何类型。 * forward_list:一个单向链表容器,元素类型可以是任何类型。 这些序列容器都提供了基本的成员函数,...

    c++多线程安全的消息队列模板

    4. **消息队列的基本结构**:一个简单的消息队列可能包含一个队列容器(如std::deque),用于存储消息,以及互斥量和条件变量,用于同步对队列的操作。 下面是一个简化的多线程安全消息队列模板的实现: ```cpp #...

    循环队列模版类

    循环队列模版类CircularQueue,充分利用内存资源实现数据类型的存储及使用

    带示例一个采用C++实现的较为经典的队列管理类

    // 使用标准库中的队列容器 std::mutex mtx; // 用于线程安全的互斥锁 public: // 入队操作 void enqueue(T const& item) { std::lock_guard&lt;std::mutex&gt; lock(mtx); // 自动获取并释放锁 data_queue.push...

    c#(容器:关联容器、适配容器、顺序容器)

    2. **Queue**: 队列容器,同样基于顺序容器,遵循“先进先出”(FIFO)原则。 3. **Priority_Queue**: 优先队列,元素根据某种优先级排序,插入和删除元素时会考虑优先级。 在实际编程中,理解这些容器的原理和应用...

    222018321062006宋行健13

    这篇实验报告是关于软件工程专业课程“类库与数据结构”的,主要探讨了容器适配器中的队列容器以及在实际应用中的模拟方法。实验旨在让学习者掌握STL(标准模板库)中的队列容器适配器实现,理解如何在真实场景中...

    c++ STL思维导图(自己总结)

    Deque容器是C++ STL中的双端队列容器,提供了两端的插入和删除操作。Deque容器提供了多种构造函数,例如`d1.push_back()`和`d1.push_front()`,用于将元素添加到容器的前端或后端。Deque容器也提供了多种操作,例如`...

    C++数据结构实现之Queue.zip

    4. **自定义队列容器** - 如果对STL的`queue`性能不满意,可以自定义容器,比如使用固定大小的数组或特定的链表实现,以满足特定需求,如限制队列大小、优化内存管理等。 5. **队列的应用场景** - **缓冲区**:在...

    超快复习C++_STL篇4

    * &lt;deque&gt;:提供了双端队列容器。 * &lt;functional&gt;:提供了函数对象。 * &lt;iterator&gt;:提供了迭代器。 * &lt;list&gt;:提供了链表容器。 * &lt;map&gt;:提供了映射容器。 * &lt;memory&gt;:提供了内存管理。 * &lt;numeric&gt;:提供了数字...

    数据结构试验一要求

    在本实验“数据结构试验一要求”中,我们将深入探讨两种基本的数据结构——队列和栈,并学习如何利用STL(Standard Template Library,标准模板库)中的优先队列容器适配器。这次实验旨在通过实际操作,加深我们对...

    C++ STL 开发技术导引(随书源码)

    第7章 deque双端队列容器 第8章 list双向链表容器 第9章 slist单向链表容器 第10章 bit_vector位向量容器 第11章 set集合容器 第12章 multiset多重集合容器 第13章 map映照容器 第14章 multimap多重映照容器 第15章 ...

    stl标准数据库

    顺序性容器是按照线性顺序存储数据,支持快速的顺序访问,包括vector(向量容器)、list(双向链表容器)和deque(双向队列容器)。关联容器是基于键值存储数据的容器,它们通常能够保持元素的排序,并且具有快速...

    2Queue1Stack.rar_Two Queues

    在这个项目中,开发者可能使用了C++的标准模板库(STL)中的队列容器,如`std::queue`,来实现这个数据结构。C++的队列容器提供了便利的接口,如`push()`、`pop()`和`front()`等,用于进行队列操作。 代码实现的...

    数据结构实验\c++ 中实现queue代码 可以运行

    在C++中,`&lt;queue&gt;`头文件包含了对队列容器的定义和操作。在这个数据结构实验中,我们关注的是如何使用C++来实现一个自定义的队列。在描述中提到,这个实验是在Visual Studio 6.0环境下完成的,这个版本的IDE在20...

Global site tag (gtag.js) - Google Analytics