最近,一直在跟设计的任务调度模块周旋,目前终于完成了第一阶段的调试。今天,我想借助博客园平台把最近在设计过程中,使用队列和集合的一些基础知识给大家总结一下,方便大家以后直接copy。本文都是一些没有技术含量的东西,只是做个总结,牛哥还请绕路。

老习惯,还是先跟各位纸上谈会儿兵,首先说说队列,他主要分为并发队列和阻塞队列,在多线程业务场景中使用最为普遍,我就主要结合我所做过的业务谈谈我对它们的看法,关于它们的API和官方解释就不提了。

并发队列

并发队列:最常见的业务场景就是多个线程共享同一个队列中的所有资源,就拿我们公司的业务场景来说,当用户通过多个渠道下单后,然后就会有多个不同的客户端通道同时去获取订单并处理订单,为了加快订单处理速度我们使用并发队列来充当任务源头,为了加快处理订单速度,结合多线程并发来满足需求。

并发队列没什么可说的,就是一个简单的多线程编程操作,小Demo送给各位:

 1 /**
 2  *  并发队列ConcurrentLinkedQueue的使用
 3  */
 4 
 5 public class ConcurrentQueue {
 6 
 7     public static void main(String[] args){
 8         ToyotaYQ yq = new ToyotaYQ();
 9         new Thread(yq,"ToyotaYQ_001").start();
10         new Thread(yq,"ToyotaYQ_002").start();
11         new Thread(yq,"ToyotaYQ_003").start();
12     }
13 
14 }
15 
16 /**
17  * 任务来源
18  */
19 class MQ{
20     private static Queue<String> queue = null;    //并发队列(线程安全)
21 
22     /**
23      * 初始化并发队列
24      */
25     public static Queue<String> initQueue(){
26         if(queue == null){
27             queue = new ConcurrentLinkedQueue<String>();
28         }
29         String tasklist = "JF1GH78F18G036149,JF1SH95F6AG110830,JF1SJ94D7DG010387,JF1SH92F9CG269249,JF1SH92F5BG215090,JF1SH92F5BG222556,JF1SH92F4CG279994,JF1BR96D7CG114298,JF1BR96D0BG078632,JF1SH95F9AG094011,JF1SH98FXAG186997,JF1BM92D8BG022510,JF1BM92DXAG013855,JF1BM94D8EG036618";
30         String[] split = tasklist.split(",");
31         List<String> task = Arrays.asList(split);    //数组转集合
32         queue.addAll(task);        //按照集合中元素的顺序将集合中全部元素放进队列
33 
34         return queue;
35     }
36 }
37 
38 /**
39  * 制单客户端
40  */
41 class ToyotaYQ implements Runnable{
42 
43     private static final Object lock = new Object();
44     private static Queue<String> queueYQ = MQ.initQueue();
45 
46     @Override
47     public void run() {
48         while(true){
49             synchronized (lock){    //尽量减小锁的粒度和范围
50                 String thisVIN = queueYQ.poll();
51                 if(thisVIN == null){
52                     break;
53                 }
54                 System.out.println(Thread.currentThread().getName() + "成功制单:" + thisVIN + "。剩余:" + queueYQ.size() + "个任务");
55             }
56         }
57     }
58 }
View Code

相关文章:

  • 2022-12-23
  • 2021-12-18
  • 2021-09-23
猜你喜欢
  • 2022-12-23
  • 2022-01-03
  • 2021-05-20
  • 2021-11-08
  • 2021-10-13
  • 2021-07-12
相关资源
相似解决方案