美文网首页
谈谈 Callable 、 Future 、 Runnable

谈谈 Callable 、 Future 、 Runnable

作者: 三石_5f43 | 来源:发表于2020-07-23 11:28 被阅读0次

谈谈 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 .jpg
isDone() 方法 检测任务是否执行完成
  • true: 标识任务执行成功, 出现异常的情况依然标识任务已经执行成功。
  • false: 标识任务还未执行完成。
cancel() 方法 取消任务执行
  • 任务还未开始执行,调用cancel 方法,任务会被正常取消, cancel() 方法执行返回true
  • 任务已经被 取消或则已完成,调用cancel() 方法,返回false
  • 任务正在执行情况下,调用了cancel() 方法,不会直接取消任务的执行, 会根据 mayInterruptIfRunning 参数决定是否让当前正在执行任务的线程响应中断信号, 如果为true ,那么正在执行任务的线程会收到一个中断信号,处理中断逻辑,false 则表示不中断当前任务的执行, cancel 方法返回 false。

Future 产生新的线程了吗?

Callable 和 Future 并不能产生新的线程, 需要借助 Thread 或者线程池(ThreadPool) 才能执行任务。

相关文章

网友评论

      本文标题:谈谈 Callable 、 Future 、 Runnable

      本文链接:https://www.haomeiwen.com/subject/sjiclktx.html