import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ConcurrentQueue {
// 一个基于链接节点的无界线程安全队列。此队列按照 FIFO(先进先出)原则对元素进行排序。
// 队列的头部 是队列中时间最长的元素。队列的尾部 是队列中时间最短的元素。新的元素插入到队列的尾部,队列获取操作从队列头部获得元素。当多个线程共享访问一个公共 collection
// 时,ConcurrentLinkedQueue 是一个恰当的选择。此队列不允许使用 null 元素。
private static ConcurrentLinkedQueue<Integer> queue = new ConcurrentLinkedQueue<Integer>();
private static int count = 100; // 需要创建的线程个数
// CountDownLatch,一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。
private static CountDownLatch latch = new CountDownLatch(count);
public static void main(String[] args) throws InterruptedException {
// 比如这个方法,,一段时间执行一次。定个时什么的。。。。
long timeStart = System.currentTimeMillis();
// ExecutorService 提供了管理终止的方法,以及可为跟踪一个或多个异步任务执行状况而生成 Future 的方法。
ExecutorService es = Executors.newFixedThreadPool(4);// 创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程。
ConcurrentQueue.tidan();// 提交订单
for (int i = 0; i < count; i++) {
// 多个进程一起收单
es.submit(new ShouDan());// 提交一个 Runnable 任务用于执行,并返回一个表示该任务的 Future。
}
latch.await(); // 使得主线程(main)阻塞直到latch.countDown()为零才继续执行
System.out.println("cost time " + (System.currentTimeMillis() - timeStart) + "ms");
es.shutdown();// 如果此执行程序已关闭,则返回 true。
}
/**
* 提交订单到队列
*/
public static void tidan() {
for (int i = 0; i < 10; i++) {
queue.offer(i);// 将指定元素插入此队列的尾部。
}
}
/**
* 从队列取出订单做你想做的操作比如保存到数据库呀。。记录日志呀。。什么的。。。。
*/
static class ShouDan implements Runnable {
public void run() {
// while (queue.size()>0) {
while (!queue.isEmpty()) {
System.out.println(queue.poll());// 获取并移除此队列的头,如果此队列为空,则返回 null。
}
latch.countDown();// 递减锁存器的计数,如果计数到达零,则释放所有等待的线程。
}
}
}
分享到:
相关推荐
标题中的“cpp-一个快速多生产者多消费者的C11无锁并发队列”指的是一个用C++11标准编写的高效并发数据结构,特别设计用于支持多个生产者线程和多个消费者线程同时访问的无锁并发队列。这种队列在多线程环境中非常...
在本主题中,我们将深入探讨Swift中的全局并发队列,以及如何利用它们来创建一个管理工具。 全局并发队列是GCD提供的预定义队列,用于执行后台任务。它们是系统维护的,开发者无需创建或销毁。有四个优先级不同的...
在"java 线程池实现多并发队列后进先出"这个主题中,我们关注的是线程池如何利用特定类型的队列来实现后进先出(LIFO,Last-In-First-Out)的行为。通常,线程池默认使用先进先出(FIFO,First-In-First-Out)的队列...
### 快速非阻塞并发队列算法 #### 摘要与背景 本文提出了一种新的非阻塞并发队列算法以及一种两锁队列算法,这两种算法都允许一个入队操作和一个出队操作同时进行。这些算法简单、快速且实用,在先前的研究文献中...
1. **创建并发队列**:你可以通过`dispatch_queue_create()`函数创建自定义并发队列,或者使用全局并发队列。全局队列是系统提供的,已经预设为并发执行,可以直接使用。 2. **提交任务**:使用`dispatch_async()`...
当我们谈论“OC-并发队列在异步线程中执行”时,我们实际上是在讨论多线程编程中的一个关键概念——GCD(Grand Central Dispatch),这是Apple提供的用于管理并发任务的高级工具。 GCD是Apple的底层任务调度系统,...
### 并发队列 ConcurrentLinkedQueue 和阻塞队列 LinkedBlockingQueue 用法详解 #### 一、并发队列 ConcurrentLinkedQueue 概述 `ConcurrentLinkedQueue` 是 Java 并发包 `java.util.concurrent` 提供的一个高性能...
fast-wait-free-queue, 并发队列实现的基准框架 快速等待空闲队列这是评估并发队列性能的基准测试框架。 目前,它包含4 个并发队列。 它们是:一个快速等待队列 wfqueueafek的Morrison和 lcrqkallimanis的Fatourou和...
设计并发队列 代码如下:#include <pthread>#include <list>using namespace std; template <typename>class Queue { public: Queue( ) { pthread_mutex_init(&_lock, NULL); } ~Queue( ) { pthread_mutex_destroy(&...
concurrentqueue, 一种快速多消费者多消费者锁空闲并发队列 moodycamel::ConcurrentQueue面向 C 的工业强度锁自由队列。注意:如果你只需要一个生产者,单个消费者队列,我有其中的一个太多。特性Knock-your-socks-...
总结来说,自扩充的Lock-Free并发环形队列算法通过锁无关的机制实现了高效且动态扩展的并发队列,适用于高并发的场景。尽管实现复杂,但通过巧妙地利用原子操作和循环链表结构,可以在不牺牲性能的前提下,有效地...
并发队列可以异步执行多个任务,它们可以在不同的线程上并行运行。苹果提供了全局并发队列,也可以自定义创建。 - 全局并发队列:系统提供的一组预设队列,可以按需使用。有四个优先级:高、默认、低和后台。 - ...
提到“队列”,这里可能指的是并发队列,如Java中的`ConcurrentLinkedQueue`或C++的`std::queue`配合`std::mutex`等同步原语。并发队列在多线程环境中用于存储和传递任务,它能够保证线程安全,即在多个线程并发访问...
在这个案例中,我们关注的是一个具有优先级和因子特性的异步并发队列。 首先,让我们了解`ConcurrentQueue`的基本概念。它是一个队列数据结构,遵循先进先出(FIFO)原则,即最先插入的元素将最先被处理。然而,...
C ++的工业级无锁队列。 注意:如果您需要的只是一个单一生产者,单一消费者队列,那么我也可以选择。 特征 击倒你的。 单头实现。 只需将其放入您的项目中即可。 完全线程安全的无锁队列。 从任何数量的线程...
《并发队列库 cocurrentqueue:提升程序性能的关键》 在多线程编程中,队列是一种常用的数据结构,用于在线程间传递数据和任务。高效的队列管理是确保并发性能的关键因素。 cocurrentqueue库,正如其名,是一个专为...
《C++11实现的有界多生产者多消费者并发队列详解》 在多线程编程中,数据共享和同步是核心问题之一。有界多生产者多消费者(Multiple Producer Multiple Consumer,简称MPMC)并发队列是一种高效且安全的数据结构,...