实现Callable接口创建线程
@[toc]
(JDK5.0新增的线程创建方式)
- 与使用Runnable相比, Callable功能更强大些
- 相比run()方法,可以有返回值
- 方法可以抛出异常
- 支持泛型的返回值 (后续专门有文章讲解泛型)
- 需要借助FutureTask类,比如获取返回结果
- Future接口
- 可以对具体Runnable、Callable任务的执行结果进行取消、查询是 否完成、获取结果等。
- FutrueTask是Futrue接口的唯一的实现类
- FutureTask 同时实现了Runnable, Future接口。它既可以作为 Runnable被线程执行,又可以作为Future得到Callable的返回值
具体步骤在代码注释之中
代码:
package com.jsm.java2;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
/*
创建线程的方式三:实现Callable接口
步骤:
*/
public class ThreadNew {
public static void main(String[] args) {
//3.创建Callable接口实现类的对象
NumThread n1 = new NumThread();
//4.将此Callable接口实现类的对象作为传递到FutureTest构造器中,创建FutureTask的对象
FutureTask f1 = new FutureTask(n1);
//5.将FutureTask的对象传递到Thread类的构造器中,创建Thread对象并且调用start方法
new Thread(f1).start();//启动线程
try {
//6.获取Callable中call方法的返回值
//get方法返回值即为FutureTask构造器参数callable实现类重写的的call方法的返回值。
Object sum = f1.get();
System.out.println("总和为:"+sum);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
//1. 创建一个实现Callable的实现类
class NumThread implements Callable {
//2. 实现call方法,将此线程需要执行的操作声明在call中
@Override//快捷键:输入call然后回车
public Object call() throws Exception {
int sum =0;
for (int i = 0; i <=100; i++) {
if (i%2==0){
System.out.println(i);
sum+=i;
}
}
//如果不需要返回值就return一个null
return sum;//多态
}
}