1. 什么是异步计算?
异步计算是分布式计算的一种实现方式,开发人员不必花费太多的硬件成本,即可通过软件方式以更低的成本实现大规模运算需要的处理能力。
2. 为什么我们要使用异步计算?
顾名思义就是不通的线程去做不同的事最后在进行数据汇总并返回结果。在一些业务比较复杂,某些方法计算比较耗时的时候单线程就无法快速返回结果用户响应时间变长,这个时候就要使用异步计算来加快数据处理速度传统的 Runnable
接口不能返回结果,在JDK1.5之后增加了 Callable
接口可以在线程执行完后返回结果。
3.
Callable
接口和Runnable
接口不同点
- 两者最大的不同点是:实现
Callable
接口的任务线程能返回执行结果;而实现Runnabl
e接口的任务线程不能返回结果; -
Callable
接口的call()
方法允许抛出异常;而Runnable
接口的run()
方法的异常只能在内部消化,不能继续上抛;
注意点
Callable
接口支持返回执行结果,此时需要调用 FutureTask.get()
方法实现,此方法会阻塞主线程直到获取‘将来’结果;当不调用此方法时,主线程不会阻塞!
4. 代码
4.1 实现 Callable
接口
public class FuTrue implements Callable<Integer>{
private Integer num;
public FuTrue(Integer num) {
this.num=num;
}
@Override
public Integer call() throws Exception {
System.out.println("异步线程:"+Thread.currentThread().getName());
return num+num;
}
}
public static void main(String[] arg) throws InterruptedException, ExecutionException {
ExecutorService ex=Executors.newCachedThreadPool();
Integer num=10;
FutureTask<Integer> task=new FutureTask<Integer>(new FuTrue(num));
ex.submit(task);
System.out.println("计算之后的num="+task.get()+"\n");
System.out.println("主线程名:"+Thread.currentThread().getName());
System.out.println("计算之前的num="+num);
//关闭线程
if(!ex.isShutdown()) {
ex.shutdown();
}
}
4.2 执行结果
异步线程:pool-1-thread-1
计算之后的num=20
主线程名:main
计算之前的num=10
通过执行情况我们可以看到异步执行的结果最后在调用 task.get()
方法时返回了计算后的结果。