从Java的第一个发行版开始,Java的美丽之处之一就是我们可以轻松编写多线程程序并将异步处理引入我们的设计中。 Thread类和Runnable接口与Java的内存管理模型结合使用,意味着可以进行简单的线程编程。 但是,如第3部分所述, Thread类和Runnable接口均不允许抛出Exception或返回值。 缺乏返回值的问题令人不快。

缺少引发检查异常的情况更为严重。 合同是public void run() ,这意味着您必须捕获受检查的异常并对其进行处理。 即使您很小心并且将它们存储起来以供以后验证,也不能强制所有使用此类的类来检查异常。 您可以遍历所有的获取器,并在每个异常中都存在异常时抛出该异常 。 除了麻烦之外,即使那也不是万无一失的。 您无法强制调用其中任何一个。 线程程序员会正确地调用join()以等待它完成,然后可能会继续前进。

不过不用担心,多年之后,终于在1.5版本中解决了这个问题。 通过在上一篇文章中讨论的CallableFuture接口的引入以及它们在线程池中的支持,这两个问题都得到了很好的解决。

可召回

Callable接口声明公共T call()抛出Exception 。 现在我们可以返回结果,将其强类型化为实现中声明的类型,甚至抛出Exceptions 。 尽管Executors类中有一些实用程序方法可以如第3部分中所述转换您的Runnable实例,但最好还是回顾一下您当前对RunnableThread子类的实现。 何必呢? 主要是为了仔细检查并删除可能为解决缺少对抛出的异常的支持而实施的变通方法。 同时,您可能希望利用在执行方法中直接返回结果的功能,而无需进行强制转换以检索值。

未来

这是线程池和Callable的组合功能在一起的地方。 Future是1.5中引入的另一个新接口。 当您向一个线程池提交Callable时 ,将为您提供Future的实例,该实例的类型将传递给您传入的Callable 。此对象替代您在1.5之前使用的实际Thread实例。 以前您必须执行Thread.join()Thread.join(long millis) ,现在您可以像本例中那样使用它们。

public class ServerAcceptingRequestsVerifier implements Callable {/*** @return Boolean.TRUE is server is accepting requests* Boolean.FALSE otherwise*/public Boolean call() throws Exception {Boolean isAcceptingRequests = null;... ask server about taking requests herereturn isAcceptingRequests;}
}
public Boolean isServerTakingRequests(String server)throws UnresponsiveException, InterruptedException {ServerAcceptingRequestsVerifier acceptingRequestsVerifier =new ServerAcceptingRequestsVerifier();Future future =THREAD_POOL.submit(acceptingRequestsVerifier);try {Boolean isAcceptingRequests = future.get();//waits for the thread to complete, even if it hasn't startedreturn isAcceptingRequests;} catch (ExecutionException e) {throw new UnresponsiveException(e.getCause());}}

如果决定限制愿意等待完成的时间,那么现在有了显式的TimeoutException也很好。

try {Boolean isAcceptingRequests = future.get(5, TimeUnit.SECONDS);//this waits for 5 seconds, throwing TimeoutException if not donereturn isAcceptingRequests;
} catch (TimeoutException e) {LOGGER.warn("Timed out waiting for server check thread." +"We'll try to interrupt it.");future.cancel(true);return Boolean.FALSE;
} catch (ExecutionException e) {throw new UnresponsiveException(e.getCause());
}

在我们的下一篇文章中,我们将介绍一些用于使线程池正常工作的新接口/类,这些接口/类也可供我们使用。

参考:我们的JCG合作伙伴在Carfey Software博客上提供的 Java Concurrency Part 4 – Callable,Future 。

相关文章 :
  • Java并发教程–信号量
  • Java并发教程–重入锁
  • Java并发教程–线程池
  • Java并发教程–阻塞队列
  • Java并发教程– CountDownLatch
  • Exchanger和无GC的Java
  • Java Fork / Join进行并行编程
  • 使用迭代器时如何避免ConcurrentModificationException
  • 改善Java应用程序性能的快速技巧

翻译自: https://www.javacodegeeks.com/2011/09/java-concurrency-tutorial-callable.html

Java并发教程–可调用,将来相关推荐

  1. Java并发教程– CountDownLatch

    Java中的某些并发实用程序自然会比其他并发实用程序受到更多关注,因为它们可以解决通用问题而不是更具体的问题. 我们大多数人经常遇到执行程序服务和并发集合之类的事情. 其他实用程序不太常见,因此有时它 ...

  2. Java并发教程–阻塞队列

    如第3部分所述,Java 1.5中引入的线程池提供了核心支持,该支持很快成为许多Java开发人员的最爱. 在内部,这些实现巧妙地利用了Java 1.5中引入的另一种并发功能-阻塞队列. 队列 首先,简 ...

  3. Java并发教程–重入锁

    Java的synced关键字是一个很棒的工具–它使我们能够以一种简单可靠的方式来同步对关键部分的访问,而且也不难理解. 但是有时我们需要对同步进行更多控制. 我们要么需要分别控制访问类型(读取和写入) ...

  4. Java并发教程–信号量

    这是我们将要进行的Java并发系列的第一部分. 具体来说,我们将深入探讨Java 1.5及更高版本中内置的并发工具. 我们假设您对同步和易失性关键字有基本的了解. 第一篇文章将介绍信号量-特别是对信号 ...

  5. Java并发教程–线程池

    Java 1.5中提供的最通用的并发增强功能之一是引入了可自定义的线程池. 这些线程池使您可以对诸如线程数,线程重用,调度和线程构造之类的东西进行大量控制. 让我们回顾一下. 首先,线程池. 让我们直 ...

  6. java并发调用_Java并发教程–可调用,将来

    java并发调用 从Java的第一个发行版开始,Java的美丽之处之一就是我们可以轻松编写多线程程序并将异步处理引入我们的设计中. Thread类和Runnable接口与Java的内存管理模型结合在一 ...

  7. Java并发教程(Oracle官方资料)

    2019独角兽企业重金招聘Python工程师标准>>> 本文是Oracle官方的Java并发相关的教程,感谢并发编程网的翻译和投递. (关注ITeye官微,随时随地查看最新开发资讯. ...

  8. oracle java 并发_【转】JAVA并发教程(ORACLE官网资料)

    本文是Oracle官方的Java并发相关的教程,感谢并发编程网的翻译和投递. 计算机的使用者一直以为他们的计算机可以同时做很多事情.他们认为当其他的应用程序在下载文件,管理打印队列或者缓冲音频的时候他 ...

  9. Java并发教程–锁定:显式锁定

    1.简介 在许多情况下,使用隐式锁定就足够了. 有时,我们将需要更复杂的功能. 在这种情况下, java.util.concurrent.locks包为我们提供了锁定对象. 当涉及到内存同步时,这些锁 ...

最新文章

  1. 几款自用的IDEA高效插件
  2. sharepoint 2010 内容类型
  3. B站面试官炫耀身价过亿,贬低北邮应试者引热议!不知北邮毕业的B站创始人作何感想?
  4. 基础补充:使用xlrd模块读取excel文件
  5. 解读千人千面,洞悉数据智能的价值
  6. python pynlpir中科院分词的使用
  7. 网络namespace
  8. 周三直播丨Oracle 12cR2 ADG LGWR Library Cache案例分享
  9. 区块链技术与微服务架构之间有什么关系?
  10. hdu 1709 母函数变形
  11. 2021年Web前端开发的趋势有哪些
  12. xp计算机字体在哪,Windows XP系统字体库在哪-如何安装新字体
  13. [家里蹲大学数学杂志]第033期稳态可压Navier-Stokes方程弱解的存在性
  14. FileZilla查看站点隐藏文件
  15. PaaS平台案例汇,企业PaaS平台搭建思路
  16. 2021年五一赛A题-疫苗生产优化问题
  17. 产品720vr全景摄影展示吸引客户主动浏览
  18. A - Vector-Sort,向量,排序
  19. 智慧检务大数据平台 电子检务大数据整体解决方案解决方案
  20. ESP8266-Arduino编程实例-MS5611气压传感器驱动

热门文章

  1. MySQL日志:binlog、事务日志(redo、undo)
  2. java记录目录树_Java记录
  3. jpa embedded_JPA @Embeddable和@Embedded
  4. 垃圾回收算法以及垃圾回收器_什么是垃圾回收?
  5. jpa和hibernate_JPA和Hibernate级联类型的初学者指南
  6. jcache_窥探JCache API(JSR 107)
  7. 如何使用可外部化的接口在Java中自定义序列化
  8. jboss junit_使用junit-drools进行JBoss Drools单元测试
  9. 行为设计模式:中介者
  10. 在JDK 9中将InputStream传输到OutputStream