在JDK5.0之前,创建线程有2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口。
这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果。
如果需要获取执行结果,就必须通过共享变量或者使用线程通信的方式来达到效果,这样使用起来就比较麻烦。
而自从Java 1.5开始,就提供了Callable和Future,通过它们可以在任务执行完毕之后得到任务执行结果。
新增方式:实现Callable接口
- 与使用Runnable相比, Callable功能更强大些:
- 相比run()方法,可以有返回值
- 方法可以抛出异常
- 支持泛型的返回值
需要借助FutureTask类,比如获取返回结果
新增方式:Future接口
- 可以对具体Runnable、Callable任务的执行结果进行取消、查询是否完成、获取结果等。
- FutrueTask是Futrue接口的唯一的实现类
- FutureTask 同时实现了Runnable, Future接口。它既可以作为 Runnable被线程执行,又可以作为Future得到Callable的返回值
创建方式如下
//1.创建一个实现Callable的实现类
class NumThread implements Callable{
//2.实现call方法,将此线程需要执行的操作声明在call方法中
@Override
public Integer call() throws Exception {
return 0;
}
}
class ThreadNew {
public static void main(String[] args) {
//3.创建Callable接口实现类的对象
NumThread numThread = new NumThread();
//4.将此Callable实现类的对象作为参数传递到FutureTask构造器中,创建FutureTask的对象
FutureTask futureTask = new FutureTask(numThread);
//5.将FutureTask的对象作为参数传递到Thread类的构造器中,创建Thread对象,并调用start方法
new Thread(futureTask).start();
try {
//6.获取Callable中的call方法的返回值
//get方法的返回值为FutureTask构造器参数Callable实现类重写的call方法的返回值。
Object a = futureTask.get();
System.out.println("线程返回值:"+a);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}