转自:http://blog.sina.com.cn/s/blog_4c2e288b01000ark.html
Callable 接口类似于 Runnable
,两者都是为那些其实例可能被另一个线程执行的类设计的。但是 Runnable 不会返回结果,并且无法抛出经过检查的异常。
用下面的例子说明他们彼此的实现的不同:
类构造:
public class RunnableClass implements Runnable{
public void run(){
}
}
public class CallableClass implements Callable{
public V call() throws Exception{
return V
}
}
类调用:
Thread runnable=new Thread(RunnableClass);
runnable.start();
Callable<int[]> callable=new callableClass();
FutureTask<int[]> future=new FutureTask(int[])(callable);
Thread t=new Thread(future);
t.start();
if(future.isDone()){
int[] intValue=future.get();
}
代码说明:
FutureTask 属于代理类 ,负责启动Callable对象,并且可以通过它来获得Callable 的返回信息。
再举一个例子,如下代码:
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* Runnable是执行工作的独立任务,但是它不返回任何值,
* 如果希望任务在完成时能够返回一个值,可以实现Callable接口
*/
public class PrimeThread {
public static void main(String[] args) throws Exception {
ExecutorService service = Executors.newCachedThreadPool();
System.out.println("==" + service.submit(new TaskResult(66)).get().toString());
}
}
class TaskResult implements Callable<String> {
private int id;
public TaskResult(int id) {
this.id = id;
}
public String call() throws Exception {
return "result of TaskWithResult " + id;
}
}