美文网首页
JavaCallable和Future

JavaCallable和Future

作者: 黎繁介 | 来源:发表于2018-06-10 15:42 被阅读7次

            JDK1.5开始,Java提供了Callable接口,此接口可以说是Runnable接口的增强版,但它不是Runnable的子接口,它是以call()方法作为线程执行体:

            call()方法可以有返回值。

            call()方法可以声明抛出异常。

            由于不是Runnable的子接口,于是Callable对象就不能作为Thread的target,但是Java提供了另一个方法Future接口来代表Callable的call()方法的返回值,Future接口有一个实现类FutureTask,并且还实现了Runnable接口,于是就可以使用FutureTask对象最为Thread的target。


    Future接口里定义了几个公共方法来关联对应的Callable任务:

            boolean cancel(boolean mayInterruptRunning):试图取消该Future关联的Callable任务。

            V get():返回Callable里call()方法的返回值。该方法会导致程序阻塞,必须等到子线程结束时才能得到返回值。

            V get(long timeout,TimeUnit unit):返回Callable里call()方法的返回值。该方法最多让程序等待timeout和unit指定的时间,到达指定时间后还没有得到返回值,将会抛出TimeoutException异常。

            boolean isCancelled():如果Callable任务在正常完成前被取消,则返回true。

            boolean isDone():如果Callable任务已经完成,则返回true。


    创建、启动有返回值的线程步骤:

            1.创建Callable接口实现类,实现call()方法,call()方法作为线程执行体,有返回值。

            2.创建Callable实现类的实例,并用FutureTask类来包装Callable对象,该Future对象封装了Callable对象的call()返回值。

            3.让FutureTask的对象作为Thread的target新建一个线程并启动它。

            4.通过FutureTask的对象的方法来获取子线程执行完后的返回值。

    实现代码:

    有返回值得线程 Future实现类FutureTsk用法 运行结果

    -------------上一节“Java-线程组”-------------------

    --------------下一节“Java-线程池”------------------

    相关文章

      网友评论

          本文标题:JavaCallable和Future

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