清池皓月

导航

 

Runnable和Callable区别
Runnable用于异步实现多线程
Callable与Runnable的功能大致相似,Callable功能强大一些,就是被线程执行后,可以返回值,并且能抛出异常。

通过Executor执行线程任务都是以Callable形式,如果传入Runnable都会转化为Callable。
通过new Thread(runnable),只能是Runnable子类形式。

public interface Runnable {
public abstract void run();
}

public interface Callable<V> {
V call() throws Exception;
}

Future
是一个接口,定义了Future对于具体的Runnable或者Callable任务的执行结果进行取消、查询任务是否被取消,查询是否完成、获取结果。

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总结
FutureTask的父类是RunnableFuture,而RunnableFuture继承了Runnbale和Futrue这两个接口
FutureTask实现了两个接口,Runnable和Future,所以它既可以作为Runnable被线程执行,又可以作为Future得到Callable的返回值,
那么这个组合的使用有什么好处呢?假设有一个很费时逻辑需要计算并且返回这个值,同时这个值不是马上需要,那么就可以使用这个组合,
用另一个线程去计算返回值,而当前线程在使用这个返回值之前可以做其它的操作,等到需要这个返回值时,再通过Future得到!

 

ExecutorService 是 Java java.util.concurrent 包的重要组成部分,是 Java JDK 提供的框架,用于简化异步模式下任务的执行。ExecutorService 会自动提供一个线程池和相关 API,用于为其分配任务。
两种创建方式:使用Excutors工厂方法;直接创建ExecutorService实例,常用的ThreadPoolExecutor
ExecutorService 可以执行 Runnable 和 Callable 任务
创建完了任务之后,就可以使用多种方法将任务分配给 ExecutorService ,比如 execute() 方法,还有 submit()、invokeAny() 和 invokeAll() 等方法。这些方法都继承自 Executor 接口。
关闭 ExecutorService 和处理 Future 返回类型。

posted on 2018-12-28 18:38  清池皓月  阅读(64)  评论(0)    收藏  举报