新增的线程创建方式(JDK5.0及以后)
实现Callable接口
-
与使用Runnable接口相比,Callable接口功能更加强大
-
相比run()方法,call()方法可以有返回值
-
call()方法可以抛出异常,从而被外界操作捕获
-
支持泛型的返回值
-
需要借助FutureTask类,比如获取返回结果
-
-
Future接口
-
可对具体Runnable,Callable任务的执行结果进行取消,查询是否完成,获取结果等
-
FutureTask是Future接口的唯一实现类
-
FutureTask同时实现了Runnable,Future接口,既可作为Runnable被线程执行,又可作为Future得到Callable的返回值
-
-
创建步骤:
①创建实现Callable接口的实现类
②实现Call()方法重写,在其中声明所需执行的操作
③创建Callable接口实现类的对象
④将此Callable接口实现类的对象作为值传递到FutureTask中
⑤获取Callable中Call方法的返回值
eg:
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
class NumThread implements Callable{
@Override
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 sum;
}
}
public class ThreadNew {
public static void main(String[] args) {
NumThread numThread = new NumThread();
FutureTask futureTask = new FutureTask(numThread);
new Thread(futureTask).start();
try {
//get()返回值即为FutureTask构造器参数Callable实现类重写call()的返回值
Object sum = futureTask.get();
System.out.println("总和为:" + sum);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}