java并发调用

从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并发第4部分–可调用的未来 。

相关文章 :
  • 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并发调用

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

  1. java并发队列_Java并发教程–阻塞队列

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

  2. java 并发锁_Java并发教程–重入锁

    java 并发锁 Java的synced关键字是一个很棒的工具–它使我们可以通过一种简单可靠的方式来同步对关键部分的访问,而且也不难理解. 但是有时我们需要对同步进行更多控制. 我们要么需要分别控制访 ...

  3. java并发常量_Java并发编程-常量对象(七)

    在创建后状态不再发生改变的对象称作常量对象(Immutable Objects).常量对象其可靠性使其广泛地用作开发简单可靠代码的策略.常量对象在开发并发程序中非常有用.由于创建后不能被改变状态,它们 ...

  4. java并发排它锁_Java并发编程进阶——锁(解析)

    一.锁是什么 java开发中进行并发编程时针对操作同一块区域时,如果不加锁会出现并发问题,数据不是自己预计得到的值.我觉得有点像mysql事务中脏读.不可重复读.幻读的问题.加锁的目的是为了保证同一时 ...

  5. java捕鱼设计_JAVA毕业设计教程:用swing实现捕鱼达人代码教程

    用JAVA SWING实现的捕鱼教程 开发工具:ECLIPSE 实现技术:JAVA SWING 用到的JAR包:xmlpull_1_1_3_4c.jar.dom4j-1.6.1.jar.jl1.0.j ...

  6. java 并发锁_Java并发教程–锁定:内在锁

    java 并发锁 在之前的文章中,我们回顾了在不同线程之间共享数据的一些主要风险(例如原子性和可见性 )以及如何设计类以安全地共享( 线程安全的设计 ). 但是,在许多情况下,我们将需要共享可变数据, ...

  7. java 并发线程_Java并发教程–线程之间的可见性

    java 并发线程 当在不同线程之间共享对象的状态时,除了原子性外,其他问题也会发挥作用. 其中之一是可见性. 关键事实是,如果没有同步,则不能保证指令按照它们在源代码中出现的顺序执行. 这不会影响单 ...

  8. java投票锁_Java并发编程锁之独占公平锁与非公平锁比较

    Java并发编程锁之独占公平锁与非公平锁比较 公平锁和非公平锁理解: 在上一篇文章中,我们知道了非公平锁.其实Java中还存在着公平锁呢.公平二字怎么理解呢?和我们现实理解是一样的.大家去排队本着先来 ...

  9. java lock 对象_Java并发编程锁系列之ReentrantLock对象总结

    Java并发编程锁系列之ReentrantLock对象总结 在Java并发编程中,根据不同维度来区分锁的话,锁可以分为十五种.ReentranckLock就是其中的多个分类. 本文主要内容:重入锁理解 ...

最新文章

  1. uC/OS-II源码分析(四)
  2. Http权威指南学习研究
  3. Spring框架你敢写精通,面试官就敢问@Autowired注解的实现原理
  4. 关于SharePoint 2010体系架构的几个话题
  5. Java桌球小游戏1
  6. Windows 7各服务项介绍
  7. Fedora/RedHat上使用Docker命令搭建Mysql服务器
  8. raspberry pi_修改磁盘映像以创建基于Raspberry Pi的homelab
  9. python列表有哪些操作_python列表的基本操作有哪些
  10. 【elasticsearch】es直接put一个数据到es Can‘t merge because of conflicts Cannot update enabled setting _source
  11. Java多线程系列--“JUC锁”07之 LockSupport
  12. 【预测模型】基于matlab RNN循环神经网络预测【含Matlab源码 363期】
  13. 文本编辑器——VI/VIM
  14. json的格式是什么?
  15. 【这很AI】是福是祸?科学家利用AI翻译狗的语言,人狗对话将成可能
  16. Python——绑定与方法调用
  17. win7 64位 SEC S3C2410X Test B/D安装
  18. 【获取内置命令ID】:VBA编程人员常用的工具。可以查询Excel内部命令的ID号
  19. 一个日本人写的插件:Breath Controller
  20. Java学习 (基础语法)day1 前言、入门程序、常量、变量

热门文章

  1. 常用数据库连接串与驱动总结
  2. PL/SQL经典练习
  3. java面向对象高级分层实例_BaseDao
  4. java后台手动分页
  5. What are definitions of ​Model, Inference and Algorithm and its associations ?
  6. 命名对象实体对象_我的对象命名
  7. activiti 变量_如何在Activiti中使用瞬态变量
  8. java设计模式教程_Java设计模式教程
  9. javadoc 标签_新的Javadoc标签@ apiNote,@ implSpec和@implNote
  10. Spring @Value批注