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
(since jdk1.5)

public interface Callable {
    /**
     * 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
(since jdk1.5)

public interface Future {
    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
extends Object
implements RunnableFuture

All Implemented Interfaces
Runnable, Future, RunnableFuture
(since jdk1.5)

public class FutureTask implements RunnableFuture

public interface RunnableFuture extends Runnable, Future {
    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 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



你可能感兴趣的:(FutureTask、Callable、Runnable、Thread、Future)