---Runnable
Module java.base
Package java.lang
@FunctionalInterface
public interface Runnable
(since jdk1.0)
public interface Runnable {
public abstract void run();
}
---Thread
Module java.base
Package java.lang
public class Thread
extends Object
implements Runnable
(since jdk1.0)
---Callable
Module java.base
Package java.util.concurrent
@FunctionalInterface
public interface Callable<V>
(since jdk1.5)
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就是对于具体的Runnable或者Callable任务的执行结果进行取消、查询是否完成、获取结果。必要时可以通过get方法获取执行结果,该方法会阻塞直到任务返回结果。
---Future
Module java.base
Package java.util.concurrent
public interface Future<V>
(since jdk1.5)
public interface Future<V> {
boolean cancel(boolean mayInterruptIfRunning);
boolean isCancelled();
boolean isDone();
V get() throws InterruptedException, ExecutionException;
V get(long timeout, TimeUnit unit)
throws InterruptedException, ExecutionException, TimeoutException;
}
---FutureTask
Module java.base
Package java.util.concurrent
public class FutureTask<V>
extends Object
implements RunnableFuture<V>
All Implemented Interfaces
Runnable, Future<V>, RunnableFuture<V>
(since jdk1.5)
public class FutureTask<V> implements RunnableFuture<V>
public interface RunnableFuture<V> extends Runnable, Future<V> {
void run();
}
FutureTask类实现了RunnableFuture接口,而RunnableFuture继承了Runnable接口和Future接口。所以它既可以作为Runnable被线程执行,又可以作为Future得到Callable的返回值。https://www.cnblogs.com/dolphin0520/p/3949310.html
FutureTask一个可取消的异步计算,FutureTask 实现了Future的基本方法,提供 start、cancel 操作,可以查询计算是否已经完成,并且可以获取计算的结果。结果只可以在计算完成之后获取,get方法会阻塞当计算没有完成的时候,一旦计算已经完成,那么计算就不能再次启动或是取消。https://blog.csdn.net/chenliguan/article/details/54345993
FutureTask提供了2个构造器:
public FutureTask(Callable<V> callable) {
}
public FutureTask(Runnable runnable, V result) {
}
FutureTask可用于异步获取执行结果或取消执行任务的场景。通过传入Runnable或者Callable的任务给FutureTask,直接调用其run方法或者放入线程池执行,之后可以在外部通过FutureTask的get方法异步获取执行结果,因此,FutureTask非常适合用于耗时的计算,主线程可以在完成自己的任务后,再去获取结果。另外,FutureTask还可以确保即使调用了多次run方法,它都只会执行一次Runnable或者Callable任务,或者通过cancel取消FutureTask的执行等。https://blog.csdn.net/chenliguan/article/details/54345993