zoukankan      html  css  js  c++  java
  • 总结--异步线程、队列、函数式编程

    需求:

      将该方法的所有请求记录到数据库中,由于面向范围广(省市级),请求多(开机等)。

    解决:

      把所有进来的请求放到队列中慢慢消费(入库),多的就丢弃。

    代码:

      创建仓库类Storage实现缓冲区

     1 public class Storage  
     2 {  
     3     /**
     4      *  仓库最大存储量  
     5      */
     6     private final int MAX_SIZE = 300_0000;  
     7   
     8     /**
     9      *  仓库存储的载体  
    10      */
    11     private LinkedBlockingQueue<AAA> list = new LinkedBlockingQueue<AAA>();  
    12   
    13     public void produce(AAA aaa){  
    14         // 如果仓库剩余容量为0  
    15         if (list.size() >= MAX_SIZE) {  
    16             System.out.println("【库存量】:" + MAX_SIZE + "/t暂时不能执行生产任务!");  
    17         }else{   
    18             try{  
    19                 // 放入产品,自动阻塞  
    20                 list.put(aaa);         
    21             }catch (InterruptedException e){  
    22                 e.printStackTrace();  
    23             }  
    24   
    25         }
    26     }  
    27  
    33     public LinkedBlockingQueue<AAA> getList(){  
    34         return list;  
    35     }  
    36   
    37     public void setList(LinkedBlockingQueue<AAA> list){  
    38         this.list = list;  
    39     }  
    40   
    41     public int getMAX_SIZE(){  
    42         return MAX_SIZE;  
    43     }  
    44 }

      仓库单例

     1 public class StorageSingleton {
     2     
     3     private static class LazyHolder { 
     4         
     5        private static final Storage INSTANCE = new Storage();    
     6     } 
     7     
     8     private StorageSingleton(){}  
     9     
    10     public static final Storage getInstance() {    
    11        return LazyHolder.INSTANCE;    
    12     } 
    13     
    14 }

      消费者

     1 public class Consumer extends Thread {  
     2     private AAAService aaaService;
     3 
     4     private Storage storage = StorageSingleton.getInstance();
     5     
     6     private Executor executor;
     7     
     8     public Consumer() {
     9      // 逻辑CPU数
    10         int processors = Runtime.getRuntime().availableProcessors();
    11         // 线程池
    12         executor = new ThreadPoolExecutor(processors, processors*2+1, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(50_0000),
    13                 new RejectedExecutionHandler() {
    14                     @Override
    15                     public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
    16                         System.out.println("System busy, task count: " + executor.getTaskCount());
    17                     }
    18                 });
    19     }
    20     
    21     @Override
    22     public void run() {
    23 
    24         try {
    25             while (true) {
    26                 if (!storage.getList().isEmpty()) {
    27                     AAA aaa= storage.getList().take();
    28                     executor.execute(() -> {
    29                         try {                            
    30                             aaaService.saveAAA(aaa);
    31                         } catch (Exception e) {
    32                             e.printStackTrace();
    33                         }
    34                     });
    35                 }
    36                 Thread.sleep(2);
    37             }
    38         } catch (Exception e) {
    39 
    40             e.printStackTrace();
    41         }
    42     }
    43 
    44     public Storage getStorage() {
    45         return storage;
    46     }
    47 
    48     public void setStorage(Storage storage) {
    49         this.storage = storage;
    50     }
    51 
    52     public AAAService getAAAService() {
    53         return aaaService;
    54     }
    55 
    56     public void setAAAService(AAAService aaaService) {
    57         this.aaaService = aaaService;
    58     }
    59 
    60 }

      储存时

     1 StorageSingleton.getInstance().produce(aaa); 

  • 相关阅读:
    【linux】——man中文帮助手册安装
    【linux】——centos 分辨率配置
    松本行弘访谈录
    图灵热点之阅读篇——五月图书推荐
    《Linux/Unix 设计思想》的翻译细节讨论
    一本书的推荐序——写在《思考的乐趣》即将上市之际
    带您走进七周七语言的程序世界
    作者为何要创作《网站转换率优化之道》
    Apress水果大餐——移动开发
    “怪诞”的数学天才
  • 原文地址:https://www.cnblogs.com/onroad2019/p/14518132.html
Copyright © 2011-2022 走看看