一。
1>Callable和Future接口介绍
Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可以被创建为线程的来执行的类。
2>Callable和Runnable比较
1. Callable规定的方法是call,Runnable规定的方法是run
2. callable的任务执行后可以返回值,Runnable的run是无返回值的
3.call方法可以抛出异常,run方法不能抛出异常。我们可以根据call方法是否抛出异常进行不同操作(因为try-catch不应该作为控制流程的条件,所以不推荐这样做);
4.运行callable任务可拿到一个Future对象,Future表示的是异步计算结果,它提供了检查计算是否完成的方法和等待计算完成检索计算结果的方法。通过Future对象可以了解任务的执行情况,可以取消任务的执行,还可以获取任务执行的结果。
3>Future中的方法介绍
1.future.get()将等待callable线程执行返回结果。future.get(timeout, unit)如果等待超时将抛出超时异常。
2.future.cancel(boolean)将试图终端当前线程,boolean作用带研究
例子测试,代码如下,注意被注掉的两个地方,可以去掉注释运行试试
public class CallableTest {
public static class MyCallableClass implements Callable<String>{
private int flag=0;
public MyCallableClass(int flag){
this.flag=flag;
}
@Override
public String call() throws Exception {
if(flag==3){
while(true){
System.out.println("在执行线程3");
Thread.sleep(5000);
}
}
Thread.sleep(5000);
return "线程"+flag+"执行完";
}
}
public static void main(String[] args) {
MyCallableClass callableClass=new MyCallableClass(0);
MyCallableClass callableClass2=new MyCallableClass(1);
MyCallableClass callableClass3=new MyCallableClass(2);
ExecutorService service=Executors.newFixedThreadPool(3);
try {
Future<String> future2=service.submit(callableClass2);
Future<String> future=service.submit(callableClass3);
// System.out.println(future.cancel(false));
System.out.println(future2.get());
System.out.println(future.get());
Future<String> future3=service.submit(callableClass);
System.out.println("task3"+future3.get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
// catch (Exception e) {
// e.printStackTrace();
// }
service.shutdownNow();
}
}