zoukankan      html  css  js  c++  java
  • 再回首Java第二十四天

    Callable和Future
    Java1.5开始,Java提供了Callable接口,Callable接口提供了一个call()方法作为线程的执行体,但call()方法run()方法的功能更强大:
    call()方法可以有返回值
    call()方法可以声明抛出异常
    因此我们完全可以提供一个Callable对象作为Thread的target,而该线程的执行体就是该Callable对象的call方法。问题是:Callable对象时JDK1.5开始新增的接口,而它并不是Runnable的子接口,所以Callable对象不能直接作为Thread的target,而且call方法有个返回值 ,call方法并不是直接调用,它是作为线程的执行体调用。那么如何获得call方法的返回值呢?
    JDK1.5开始提供了一个Future接口来代表call方法的返回值,并未Future接口提供了一个FutureTask实现类,该实现类实现了Future接口,并实现了Runnable接口就可以Thread类的target接口了
    Callable接口又泛型限制,Callable接口里的泛型形参类型与call方法的返回类型相同
    在Future接口里定义了如下几个公共方法来控制它关联的Callable任务
    boolean cancel(boolean mayInterruptIfRunning):试图取消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()方法作为线程的执行体,且该call()方法有返回值
    2)创建Callable实现了的实例,使用FutureTask类来包装Callable对象,该FutureTask对象还封装了该Callable对象call()方法的返回值
    3)使用FutureTask对象作为Thread实例的target创建并启动线程
    4)调用FutureTask对象的方法来获得子线程结束后的返回值

  • 相关阅读:
    The Lobo Project: Home of Lobo (Java Web Browser) and Cobra (HTML Rendering Engine)
    基于DOM树的网页相似度研究与应用《大连理工大学》2011年硕士论文
    学习用 c/c++写crawler
    终于用上gcc4.1编译的系统了
    Android 查找SDCard 下面的文件 函数
    对HTML5 Device API相关规范的解惑
    Windows Phone开发(14):数据模板
    Windows Phone开发(13):如何规范用户的输入行为
    InputScope的62个值
    转:Windows Phone 7 设计简介
  • 原文地址:https://www.cnblogs.com/Mrxiaolong/p/5476145.html
Copyright © 2011-2022 走看看