JavaCallable和Future

        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-线程池”------------------

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容