1.使用JDK原生的线程池
当要使用线程去执行一个任务时,可以使用ExecutorService.submit(new Callable());
这样可以不影响其他的业务的执行,异步的执行我们想要的任务;
以下面是一个简单的接口为例:
/**
* JDK 线程测试
*/
@RestController
public class JdkThreadController {
@RequestMapping("/test/jdk")
public void execute() throws ExecutionException, InterruptedException {
// 固定大小的线程池 核心线程数和最大线程数=10
ExecutorService executorService = Executors.newFixedThreadPool(10);
// 记录开始时间
Long start = System.currentTimeMillis();
// 一个耗时的任务
Future<Boolean> future = executorService.submit(new Callable<Boolean>() {
/**
* Computes a result, or throws an exception if unable to do so.
*
* @return computed result
* @throws Exception if unable to compute a result
*/
@Override
public Boolean call() throws Exception {
//模拟耗时5s
Thread.sleep(5000);
return true;
}
});
// 阻塞 等待执行结果
Boolean result = future.get();
//打印结果
System.out.println("任务执行成功了,执行结果=" + result);
// 记录结束时间
Long end = System.currentTimeMillis();
// 执行时间
System.out.println("线程执行结束了,耗时=" + (end - start) + "毫秒");
System.out.println("-----------------------华丽的分割线-----------------------");
}
}
但是当有多个任务提交到线程池去执行的情况下,会有多个Future调用get()获取执行结果的时候,会造成多个future()的get串行的场景。
如果多个get(),每个get()阻塞很久,接口性能也就会受到影响。
2.guava对原生JDK线程的扩展
Guava为Java并行编程Future提供了很多有用扩展,其主要接口为ListenableFuture,并借助于Futures静态扩展。
继承自Future的ListenableFuture,允许我们添加回调函数在线程运算完成时返回值或者方法执行完成立即返回。
如果Future带有回调,这样是不是可以避免我们自己直接操作get()获取返回值,直接帮我们执行一些后续的工作?
依赖的Guava包:
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>g
版权声明:本文为ShiXueTanLang原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。