线程池接口:
//接口
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);
}
}
}
});
}