JavaCallable和Future

2018-06-10  本文已影响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-线程池”------------------

上一篇 下一篇

猜你喜欢

热点阅读