java并发调用
缺少引发检查异常的情况更为严重。 合同是public void run() ,这意味着您必须捕获受检查的异常并对其进行处理。 即使您很小心并且将它们存储起来以供以后验证,也不能强制所有使用此类的类来检查异常。 您可以遍历所有的获取器,并在每个异常中都存在该异常 。 除了麻烦之外,即使那也不是万无一失的。 您无法强制调用其中任何一个。 线程程序员会正确地调用join()以等待它完成,然后可能会继续前进。
不过不用担心,多年之后,终于在1.5版本中解决了这个问题。 通过在上一篇文章中讨论的Callable和Future接口的引入以及它们在线程池中的支持,这两个问题都得到了很好的解决。
可召回
Callable接口声明公共T call()抛出Exception 。 现在我们可以返回结果,将其强类型化为实现中声明的类型,甚至抛出Exceptions 。 尽管Executors类中有一些实用程序方法可以如第3部分中所述转换您的Runnable实例,但最好还是回顾一下您当前对Runnable或Thread子类的实现。 何必呢? 主要是为了仔细检查并删除可能为解决缺乏对抛出的异常的支持而实施的变通方法。 同时,您可能希望利用在执行方法中直接返回结果的功能,而无需进行强制转换以检索值。
未来
这是线程池和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并发调用