使用spring包里的ThreadPoolTaskExecutor线程工具执行任务,通过ListenableFuture
回调任务,实现真正的异步执行;
https://blog.csdn.net/qq_38658567/article/details/115121520
public static void main(String[] args) {
ThreadPoolTaskExecutor executorService = new ThreadPoolTaskExecutor();
executorService.setCorePoolSize(1);
executorService.setMaxPoolSize(1);
executorService.initialize();
long start = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
ListenableFuture<Boolean> asyncResult = executorService.submitListenable(() -> {
// 休息5毫秒,模拟执行
TimeUnit.MILLISECONDS.sleep(5);
//throw new RuntimeException("出现异常");
return true;
});
asyncResult.addCallback(data -> {
try {
// 休息3毫秒模拟获取到执行结果后的操作
TimeUnit.MILLISECONDS.sleep(3);
} catch (Exception e) {
e.printStackTrace();
}
}, ex -> log.info("**异常信息**", ex));
}
System.out.printf("总结耗时:%s%n", System.currentTimeMillis() - start);
}
执行时长在 40 - 60 ms
public static void main(String[] args) {
ThreadPoolTaskExecutor executorService = new ThreadPoolTaskExecutor();
executorService.setCorePoolSize(1);
executorService.setMaxPoolSize(1);
executorService.initialize();
long start = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
Future<Boolean> future = executorService.submit(() -> {
try {
// 休息5毫秒,模拟执行
TimeUnit.MILLISECONDS.sleep(5);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
});
try {
// 以阻塞的方式获取执行结果
Boolean result = future.get();
// logger.info(String.format("执行结果:%s", result));
// 休息3毫秒模拟获取到执行结果后的操作
TimeUnit.MILLISECONDS.sleep(3);
} catch (Exception e) {
e.printStackTrace();
}
}
System.out.printf("总结耗时:%s%n", System.currentTimeMillis() - start);
}
总结耗时:93936ms