FutureTask、Callable、Runnable、Thread、Future

参考

callable.png



---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



©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。