并发队列



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();// 递减锁存器的计数,如果计数到达零,则释放所有等待的线程。
}
}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值