随笔,笔记
Callable
是与 Runable
类似的一个接口,它支持参数化,只有一个方法 call
。
public interface Callable<V> {
/**
* Computes a result, or throws an exception if unable to do so.
*
* @return computed result
* @throws Exception if unable to compute a result
*/
V call() throws Exception;
}
Future
保存异步计算的结果。可以启动一个计算,将Future 对象交给某个线程。Future 对象的所有者在结果计算好之后就可以获得它。
public interface Future<V> {
// 取消计算,若还未开始,就不要开始;若以运行,并传入true 就中断。
boolean cancel(boolean mayInterruptIfRunning);
// 任务完成前被取消,返回 true
boolean isCancelled();
// 判断计算 是否完成,若完成则返回 true
boolean isDone();
// 方法会被 阻塞,直到计算完成。若线程中断 会抛出异常
V get() throws InterruptedException, ExecutionException;
// 方法被阻塞,若超时 会抛出TimeoutException。若线程被中断 则抛出InterruptedException
V get(long timeout, TimeUnit unit)
throws InterruptedException, ExecutionException, TimeoutException;
}
FutureTask
包装器,可将 Callable
转换为 Future
和 Runnable
,它同时 实现二者的接口。
Callable<Integer> myComputation = ....;
FutureTask<Integer> task = new FutureTask<>(myComputation);
// 转换成 Runnable
Thread thread = new Thread(task);
thread.start();
// 转换为 Future
Integer integer = task.get();
Callable 与 学的 Runnable 差不多,只是 Callable 有返回值。