Day24:老板我等等来拿

Future介面定义有get()方法以及isDone()方法,其目的就是在呼叫get()时看看能不能拿到执行绪跑好回传的结果,倘若还没做完程序就会阻断直到做完为止;isDone()则是先试探看看执行绪是不是已经做完了,做完就回传true,还没做完就回传false。

如果有观念很强的人可能会觉得怪怪的,因为Runnable的run()方法是void呀?那我们要怎麽知道执行绪有没有做完事情?

答案是Future的实作类别FutureTask的建构式有重载(overload)两种:
FutureTask(Runnable runnable, V result)
FutureTask(Callable callable)

如果我们是丢Runnable进去,那我们可以再指派一个某种类别的result来当作get()回传的结果。
现在我们有个新的问题了:Callable是什麽东西?

诚如刚刚我们所提到的,Future是在执行绪完成工作後会回传一个结果的行为,为了补足Runnable没有回传值的特性,官方就多定义了一个叫做Callable的介面:

package java.util.concurrent;

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

其实Callable和Runnable是几乎同样的概念,目的都是为了定义执行绪的任务,不过Callable的call()方法有回传值,并且可以抛出受检例外(checked exception)。

谈到这边就不得不谈谈ExecutorService了,因为ExecutorService除了官方帮我们覆写好的execute方法外,其本身也有类似Thread的start()的方法,叫做submit(Callable task),并且会回传Future型别的物件回来:

public static void main(String[] args) throws Exception{
    ExecuteService service = Executors.newCacheThreadPool();
    Future futureTask = service.submit(() -> dosomething());
    while(!futureTask.isDone()){
        do other things......
    }
    System.out.println("Result = " + futureTask.get());
}

<<:  焦虑与压力

>>:  UART 传输中到底要用哪种读取方式比较好呢?

[Day 30] - 终成行男

呼,想当初在铁人赛开赛前还在犹豫到底要不要开赛呢? 参赛後是要写什麽主题呢? 一探 React Na...

DAY6: Node 的内部机制(二)

上一篇DAY5: Node 的内部机制(一)主要解释了JavaScript的同步与非同步,相信看完上...

Day10:Swift 基础语法— Dictionary

前言 Dictionary 储存一堆由<key, value>组合的资料, 每一个 va...

第 22 集:Bootstrap 客制化 utilities(下)

此篇延续 Bootstrap 客制化 Sass utilities(上)最後尚未介绍的 gener...

[DAY 17] 回应试算表

存放题目和读取题目的google 试算表搞定了 呈现题目的google 表单也搞定了 接下来来说说记...