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

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 here
		return 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 started
		return 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 done
	return 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部分–可调用的未来

相关文章 :

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

java并发调用

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值