美文网首页
谈谈 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