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`是内置的双端队列容器,提供了高效且灵活的内存管理。然而,如果你想要自定义一个双端队列,我们可以从头开始探讨如何实现。 自定义双端队列的基本思想是使用动态数组或链表作为底层...
在C++中,虽然标准库并没有直接提供队列容器,但我们可以通过结合`std::deque`(双端队列)或者`std::queue`(基于其他容器的队列)来实现。`std::queue`通常使用`std::vector`或`std::deque`作为底层容器,它提供了...
- **`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**: 优先队列,元素根据某种优先级排序,插入和删除元素时会考虑优先级。 在实际编程中,理解这些容器的原理和应用...
这篇实验报告是关于软件工程专业课程“类库与数据结构”的,主要探讨了容器适配器中的队列容器以及在实际应用中的模拟方法。实验旨在让学习者掌握STL(标准模板库)中的队列容器适配器实现,理解如何在真实场景中...
Deque容器是C++ STL中的双端队列容器,提供了两端的插入和删除操作。Deque容器提供了多种构造函数,例如`d1.push_back()`和`d1.push_front()`,用于将元素添加到容器的前端或后端。Deque容器也提供了多种操作,例如`...
4. **自定义队列容器** - 如果对STL的`queue`性能不满意,可以自定义容器,比如使用固定大小的数组或特定的链表实现,以满足特定需求,如限制队列大小、优化内存管理等。 5. **队列的应用场景** - **缓冲区**:在...
* <deque>:提供了双端队列容器。 * <functional>:提供了函数对象。 * <iterator>:提供了迭代器。 * <list>:提供了链表容器。 * <map>:提供了映射容器。 * <memory>:提供了内存管理。 * <numeric>:提供了数字...
在本实验“数据结构试验一要求”中,我们将深入探讨两种基本的数据结构——队列和栈,并学习如何利用STL(Standard Template Library,标准模板库)中的优先队列容器适配器。这次实验旨在通过实际操作,加深我们对...
第7章 deque双端队列容器 第8章 list双向链表容器 第9章 slist单向链表容器 第10章 bit_vector位向量容器 第11章 set集合容器 第12章 multiset多重集合容器 第13章 map映照容器 第14章 multimap多重映照容器 第15章 ...
顺序性容器是按照线性顺序存储数据,支持快速的顺序访问,包括vector(向量容器)、list(双向链表容器)和deque(双向队列容器)。关联容器是基于键值存储数据的容器,它们通常能够保持元素的排序,并且具有快速...
在这个项目中,开发者可能使用了C++的标准模板库(STL)中的队列容器,如`std::queue`,来实现这个数据结构。C++的队列容器提供了便利的接口,如`push()`、`pop()`和`front()`等,用于进行队列操作。 代码实现的...
在C++中,`<queue>`头文件包含了对队列容器的定义和操作。在这个数据结构实验中,我们关注的是如何使用C++来实现一个自定义的队列。在描述中提到,这个实验是在Visual Studio 6.0环境下完成的,这个版本的IDE在20...