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 提供一个线程安全的类似队列的容器,它能将队列内容溢出到 failover 文件中以供后续再处理。这允许队列固定在一定尺寸中,并且定期将溢出内容写入文件中,这样在队列只有少部分内容时就可以重新阅读...
### C++ 容器与队列详解 #### 一、引言 在现代软件开发过程中,C++ 作为一种高效且灵活的编程语言被广泛应用。在 C++ 的标准库(Standard Template Library, STL)中,提供了丰富的容器类和算法,极大地提高了程序...
队列容器允许从一端新增元素,从另一端移除元素。队列中只有队头和队尾才能被外界使用,因此队列不允许有遍历行为。 队列容器常用接口 队列容器的常用接口包括: 1. 构造函数:`queue<T> que;`,创建一个空队列...
在C++中,可以使用`std::deque`(双端队列)或`std::queue`(队列容器适配器)来实现。循环队列使用固定大小的数组,通过巧妙地管理队头和队尾的索引来模拟队列的行为。当队列满时,可以“循环”回数组的开头继续插入...
在C++标准库中,`std::deque`是内置的双端队列容器,提供了高效且灵活的内存管理。然而,如果你想要自定义一个双端队列,我们可以从头开始探讨如何实现。 自定义双端队列的基本思想是使用动态数组或链表作为底层...
在C++中,虽然标准库并没有直接提供队列容器,但我们可以通过结合`std::deque`(双端队列)或者`std::queue`(基于其他容器的队列)来实现。`std::queue`通常使用`std::vector`或`std::deque`作为底层容器,它提供了...
在VC6.0环境下实现队列,通常会用到C++语言,并结合STL(Standard Template Library)中的队列容器,或者自定义数据结构来完成。STL队列是一个双端队列,由底层的两个栈协同工作,提供了enqueue(入队)和dequeue...
- **`deque<int>`**:双端队列容器,可以在两端高效地插入或删除元素。 - **`list<int>`**:双向链表容器,插入和删除操作非常快,因为它只需要修改指针即可完成操作。 - **`template<class T>`**:模板函数,允许...
* deque:一个双端队列容器,元素类型可以是任何类型。 * list:一个双向链表容器,元素类型可以是任何类型。 * forward_list:一个单向链表容器,元素类型可以是任何类型。 这些序列容器都提供了基本的成员函数,...
4. **消息队列的基本结构**:一个简单的消息队列可能包含一个队列容器(如std::deque),用于存储消息,以及互斥量和条件变量,用于同步对队列的操作。 下面是一个简化的多线程安全消息队列模板的实现: ```cpp #...
循环队列模版类CircularQueue,充分利用内存资源实现数据类型的存储及使用
// 使用标准库中的队列容器 std::mutex mtx; // 用于线程安全的互斥锁 public: // 入队操作 void enqueue(T const& item) { std::lock_guard<std::mutex> lock(mtx); // 自动获取并释放锁 data_queue.push...
2. **Queue**: 队列容器,同样基于顺序容器,遵循“先进先出”(FIFO)原则。 3. **Priority_Queue**: 优先队列,元素根据某种优先级排序,插入和删除元素时会考虑优先级。 在实际编程中,理解这些容器的原理和应用...
这些版本虽然在细节上有所差异,但都提供了基本的栈和队列容器。栈在C++中通过`std::stack`实现,提供了`push`和`pop`等操作,但不支持迭代器进行遍历。默认情况下,栈的底层实现通常是`deque`(双端队列),但也...
队列的管理则可以使用STL(Standard Template Library)中的队列容器,如`std::queue`,配合线程安全的同步机制,如互斥锁,来保证多线程环境下的正确性。 总的来说,这个压缩包提供了一个很好的学习平台,让我们...
总结来说,C++ STL队列容器在处理顺序数据流,如文件读取时,表现得尤为高效和方便。它简化了数据管理,使得我们可以专注于逻辑而不必关心底层的数据结构实现。通过结合其他STL组件,如迭代器和算法,可以构建出更...
在VC++编程环境中,`deque`...`queue`提供了一种抽象的队列接口,而`deque`则是一个功能强大的双端队列容器。在VS2010中,结合源代码和注释,你可以深入学习这两种数据结构的使用方法,并将它们应用于各种实际问题中。
本资源是一个使用分支界限法实现背包问题的实例,利用队列容器来解决该问题。下面是对标题、描述、标签和部分内容的详细解释和知识点总结。 标题:简单背包问题 C++ 实现 背包问题是运筹学和计算机科学中一个经典...