Callable接口的定义
@FunctionalInterface
public interface Callable<V> {V call() throws Exception;
}
可以看出Callable就是一个拥有call方法的接口,可以把线程中需要执行过程定义到call方法中,跟Runnable接口一样,最终的执行还是需要用到Thread的start方法。
Callable接口执行的方式
1、包装成FutureTask
class MyCallable implements Callable<Integer>{@Overridepublic Integer call() throws Exception {System.out.println("******come in call method()");return 1080;}
}/*** Callable的用法*/
public class CallableDemo {public static void main(String[] args) throws ExecutionException, InterruptedException {FutureTask<Integer> futureTask = new FutureTask(new MyCallable());new Thread(futureTask,"futureTask").start();Integer result = futureTask.get();System.out.println(result);}
}
2.通过线程池
// 自定义Callable
class Task implements Callable<Integer>{@Overridepublic Integer call() throws Exception {// 模拟计算需要一秒Thread.sleep(1000);return 2;}public static void main(String args[]){// 使用ExecutorService executor = Executors.newCachedThreadPool();Task task = new Task();Future<Integer> result = executor.submit(task);// 注意调用get方法会阻塞当前线程,直到得到结果。// 所以实际编码中建议使用可以设置超时时间的重载get方法。System.out.println(result.get()); }
}
两种方式最终都被返回FutureTask对象,最终调用get方法获得结果
FutureTask继承关系
通过继承关系可以看出 FutureTask最终还是实现了Runnable,FutureTask中run方法中调用了call方法,
实现FutureTask接口的线程最终还是要被包装成为Runnable,最终的实现还是通过方法一的形式。