继承Thread和实现Runnable的的缺点:
- 1.没有返回结果
- 2.没有异常
Callable和Runnable的区别:
-
1.Runnable无返回值,没有异常抛出的
-
2.Callable可以在启动线程中获取返回值,以及接受子线程的异常
总结:
FutureTask类->实现RunnableFuture接口->实现->Runnable,Future接口
FutureTask类构造方法中有Callable接口
Future接口中有get方法返回值为泛型
Callable中有: V call() throws Exception;方法,返回值为泛型,可以抛出异常
案例:
利用FutureTask类、 Callable接口来实现返回值和异常的功能
FutureTask<Integer> task = new FutureTask<Integer>(new CalcuImpl());
Thread t=new Thread(task);//因为只要传的是Runnable的实现类即可
t.start();
try {
Integer ii=task.get();
System.out.println("i am ok"+ii);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("over");
class CalcuImpl implements Callable<Integer>{
@Override
public Integer call() throws Exception {
// TODO Auto-generated method stub
for(int i=0;i<100;i++)
{
System.out.println(i);
throw new NullPointerException();
}
return 1;
}
}
运行结果:(可以获取返回值,并且能够精准的定位错误行的行号)
0
java.util.concurrent.ExecutionException: java.lang.NullPointerException
at java.util.concurrent.FutureTask.report(Unknown Source)
at java.util.concurrent.FutureTask.get(Unknown Source)
at com.ljx.th0823.THr_03.main(THr_03.java:21)
Caused by: java.lang.NullPointerException
at com.ljx.th0823.CalcuImpl.call(THr_03.java:44)
at com.ljx.th0823.CalcuImpl.call(THr_03.java:1)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
over