[size=medium]Callable类似Runnable的接口,其接口定义为
public interface Callable<V> {
V call() throws Exception;
}
Callable和Runnable的区别:
I Callable定义的方法是call,而Runnable定义的方法是run。
II Callable的call方法可以有返回值,而Runnable的run方法不能有返回值。
III Callable的call方法可抛出异常,而Runnable的run方法不能抛出异常。
Future表示异步计算的结果,它提供了检查计算是否完成的方法,以等待计算的结果。Future的cancel方法可以取消任务的执行,true表示立即中断任务,false表示允许正在执行的任务完成。get方法等待计算完成,获取计算结果。[/size]
[size=medium]参考:http://www.cnblogs.com/whgw/archive/2011/09/28/2194760.html[/size]
public interface Callable<V> {
V call() throws Exception;
}
Callable和Runnable的区别:
I Callable定义的方法是call,而Runnable定义的方法是run。
II Callable的call方法可以有返回值,而Runnable的run方法不能有返回值。
III Callable的call方法可抛出异常,而Runnable的run方法不能抛出异常。
Future表示异步计算的结果,它提供了检查计算是否完成的方法,以等待计算的结果。Future的cancel方法可以取消任务的执行,true表示立即中断任务,false表示允许正在执行的任务完成。get方法等待计算完成,获取计算结果。[/size]
public static void main(String[] args) {
// 定义3个Callable类型的任务
MyCallable task1 = new MyCallable(0);
MyCallable task2 = new MyCallable(1);
MyCallable task3 = new MyCallable(2);
// 创建一个执行任务的服务
ExecutorService es = Executors.newFixedThreadPool(3);
try {
// 提交并执行任务,任务启动时返回了一个Future对象,
// 如果想得到任务执行的结果或者是异常可对这个Future对象进行操作
Future future1 = es.submit(task1);
// 获得第一个任务的结果,如果调用get方法,当前线程会等待任务执行完毕后才往下执行
System.out.println("task1: " + future1.get());
Future future2 = es.submit(task2);
// 等待5秒后,再停止第二个任务。因为第二个任务进行的是无限循环
Thread.sleep(5000);
System.out.println("task2 cancel: " + future2.cancel(true));
// 获取第三个任务的输出,因为执行第三个任务会引起异常
// 所以下面的语句将引起异常的抛出
Future future3 = es.submit(task3);
try{
System.out.println("task3: " + future3.get());
} catch (Exception e){
System.out.println(e.toString());
}
// 停止任务执行服务
es.shutdownNow();
}
}
[size=medium]参考:http://www.cnblogs.com/whgw/archive/2011/09/28/2194760.html[/size]