谈谈 Callable 、 Future 、 Runnable 它们之间的渊源
Runnable 存在的缺陷
-
不能在任务执行完成后返回执行结果。
-
不能抛出检查类异常,必须在run 方法中声明 try catch 捕捉异常。
* @see java.lang.Thread#run() */ public abstract void run();
Callable 和 Runnable 的不同
-
执行线程任务请求的方法不同,callable 请求的是 call() 方法, runnable 请求的是run () 方法。
*/ public abstract void run(); */ V call() throws Exception;
-
从call() 方法的源码中也可以看出 ,Callable 的任务执行之后是有 泛型的V 返回值的, 而 **Runnable 任务 run() 的方法签名 是void ** 没有返回值。
-
call() 方法签名中声明了可以抛出异常,run() 方法并未声明,因而不能抛出异常。
Future 的作用是什么?
在执行大型计算任务的时候,为了不因繁重的计算任务而长时间阻塞主线程的任务执行,可以把计算任务放到子线程去执行,并通过 Future 去控制子线程的执行过程,获取计算结果,从而提高整体任务的执行效率。(是异步任务执行的思想)
Callable 和 Future 的关系
- Future 可以在执行Callable 任务之后,存储 call() 方法执行结果,并可通过 Future 的get() 方法获取执行的结果。
- 可以通过 Future 的 isDone() 方法, 来检测任务的执行情况。
- 可以通过 cancel() 方法,按照业务需求,比如耗时较长而超过了一定时间阈值取消任务的执行。
future 的主要方法
- boolean cancel(boolean mayInterruptIfRunning);
- boolean isCancelled();
- boolean isDone();
- V get() throws InterruptedException, ExecutionExcept
- V get(long timeout, TimeUnit unit)throws InterruptedException, ExecutionException, TimeoutException;(推荐使用,避免程序阻塞)
get() 方法获取任务执行结果
执行可能出现的几种场景
基础复盘-Future .jpgisDone() 方法 检测任务是否执行完成
- true: 标识任务执行成功, 出现异常的情况依然标识任务已经执行成功。
- false: 标识任务还未执行完成。
cancel() 方法 取消任务执行
- 任务还未开始执行,调用cancel 方法,任务会被正常取消, cancel() 方法执行返回true。
- 任务已经被 取消或则已完成,调用cancel() 方法,返回false。
- 任务正在执行情况下,调用了cancel() 方法,不会直接取消任务的执行, 会根据 mayInterruptIfRunning 参数决定是否让当前正在执行任务的线程响应中断信号, 如果为true ,那么正在执行任务的线程会收到一个中断信号,处理中断逻辑,false 则表示不中断当前任务的执行, cancel 方法返回 false。
Future 产生新的线程了吗?
Callable 和 Future 并不能产生新的线程, 需要借助 Thread 或者线程池(ThreadPool) 才能执行任务。
网友评论