本文内容将基于JDK1.7的源码进行讨论,并且在文章的结尾,笔者将会给出一些经验之谈,希望能给学习者带来些帮助。
举个例子
我们以一个例子开始开始本文内容。
有一个作家,他准备开始写作,写作时间大约1个小时,作家想“那就在写作的时候顺便煮一些食物”,写作完刚好吃一点热食物。煮食物的时间我们假设是2个小时,那么煮食物的这个过程就是一个“异步任务”,我们把它用代码实现出来:
public static class Food implements Callable<String>{
public String call() {
System.out.println("hot food starts");
try {
// 煮食物ing
Thread.sleep(20000l);
} catch (Exception e) {
// ignore
}
System.out.println("hot food ends");
return "food is ok";
}
}
public static void main(String[] args) {
System.out.println("writing starts");
FutureTask<String> futureTask = new FutureTask<String>(new Food());
// 使用新线程
Thread thread = new Thread(futureTask);
thread.start();
try {
// 写作ing
Thread.sleep(20000l);
} catch (Exception e) {
// ignore
}
System.out.println("writing ends");
try {
String result = futureTask.get();
System.out.println(result);
} catch (Exception e) {
// ignore
}
}
为什么要异步
有些时候,为了快速响应,或者节省任务执行时间,有些任务是可以并行执行的。
举个例子,我们正在执行某个计算的时候,需要通过http请求获得某个远程服务的结果,而计算过程也是一个耗时操作,可以在计算开始前先发起一个异步任务做http请求,在需要使用到远程服务结果的位置,查看当前异步任务是否已经执行完成,可以做到两件事情同步进行,缩短了任务执行时间。