1.Callable接口与Runnable接口区别:
(1).实现Callable接口和Runnable接口实现类,都是可以被线程执行的任务
(2).Callable接口抛异常,Runnable接口不抛异常
(3).Callable任务运行后,可以获取oncurrent包Future对象,Future对象可以获取任务返回值,Future表示异步计算的结果,提供了检测计算是否完成的方法get(),通过cancel(task)方法,可以取消执行中的任务 Runnable接口不行
(4).类实现Callable接口,要实现Call方法,类实现Runnable接口,要实现run()方法
public class CallableDemo implements Callable {
private int flag;
public CallableDemo(int flag) {
this.flag = flag;
}
public String call() throws Exception {
if (0 == flag) {
return "0";
} else if (1 == flag) {
Thread.sleep(10000);
}
return "bad parameter";
}
public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(4);
CallableDemo callableDemo1 = new CallableDemo(0);
Future<String> future1 = executorService.submit(callableDemo1);
try {
System.out.println(future1.get());//返回结果,才会执行下面的代码
CallableDemo callableDemo2 = new CallableDemo(1);
Future<String> future2 = executorService.submit(callableDemo2);//等待10s才有数据返回
Thread.sleep(3000);
future2.cancel(true);//中断线程运行
CallableDemo callableDemo3 = new CallableDemo(2);
Future<String> future3 = executorService.submit(callableDemo3);
System.out.println(future3.get());//返回结果,才会执行下面的代码
} catch (InterruptedException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
} catch (ExecutionException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
}
}