微信路由消息机制--------线程池使用

线程池接口: 

//接口
public interface Executor {

    void execute(Runnable command);
}
----------------------------------
//使用
ExecutorService executorService = Executors.newFixedThreadPool(10);  
  
executorService.execute(new Runnable() {  
    public void run() {  
        System.out.println("Asynchronous task");  
    }  
});  
//关闭  
executorService.shutdown();  

任务的委托(Task Delegation)

下方展示了一个线程的把任务委托异步执行的ExecutorService的示意图。

                                                         

壹旦线程把任务委托给 ExecutorService,该线程就会继续执行与运行任务无关的其它任务。

这里有几种不同的方式让你将任务委托给壹個 ExecutorService:

execute(Runnable)  这种方式没有办法获取执行 Runnable 之后的结果
submit(Runnable)   同样接收壹個 Runnable 的实现作为参数,但是会返回壹個 Future 对象。可以用于判断 Runnable 是否结束执行。
submit(Callable)  
invokeAny(...)  
invokeAll(...)  

在微信后台中使用:

   1.创建线程池

this.executorService = Executors.newFixedThreadPool(DEFAULT_THREAD_POOL_SIZE);

 2.接收线程结果

final List<Future<?>> futures = new ArrayList<>();
    for (final WxMpMessageRouterRule rule : matchRules) {
      // 返回最后一个非异步的rule的执行结果
      if (rule.isAsync()) {
        futures.add(
          this.executorService.submit(new Runnable() {
            @Override
            public void run() {
              rule.service(wxMessage, context, mpService, WxMpMessageRouter.this.sessionManager, WxMpMessageRouter.this.exceptionHandler);
            }
          })
        );
      } else {
       //返回同步最后一个,每次res赋值,保留最后一个,所有通用写最后
        res = rule.service(wxMessage, context, mpService, this.sessionManager, this.exceptionHandler);
        // 在同步操作结束,session访问结束
        this.log.debug("End session access: async=false, sessionId={}", wxMessage.getFromUser());
        sessionEndAccess(wxMessage);
      }
if (futures.size() > 0) {
      this.executorService.submit(new Runnable() {
        @Override
        public void run() {
          for (Future<?> future : futures) {
            try {
              future.get();
              WxMpMessageRouter.this.log.debug("End session access: async=true, sessionId={}", wxMessage.getFromUser());
              // 异步操作结束,session访问结束
              sessionEndAccess(wxMessage);
            } catch (InterruptedException e) {
              WxMpMessageRouter.this.log.error("Error happened when wait task finish", e);
              Thread.currentThread().interrupt();
            } catch (ExecutionException e) {
              WxMpMessageRouter.this.log.error("Error happened when wait task finish", e);
            }
          }
        }
      });
    }

猜你喜欢

转载自blog.csdn.net/lidongliangzhicai/article/details/89100798