山西响应式网站平台,amp for wordpress,f2c网站建设,深圳市城乡和建设局网站首页从Java的第一个发行版开始#xff0c;Java的美丽之处之一就是我们可以轻松编写多线程程序并将异步处理引入我们的设计中。 Thread类和Runnable接口与Java的内存管理模型结合使用#xff0c;意味着可以进行简单的线程编程。 但是#xff0c;如第3部分所述#xff0c; Thread… 从Java的第一个发行版开始Java的美丽之处之一就是我们可以轻松编写多线程程序并将异步处理引入我们的设计中。 Thread类和Runnable接口与Java的内存管理模型结合使用意味着可以进行简单的线程编程。 但是如第3部分所述 Thread类和Runnable接口均不允许抛出Exception或返回值。 缺乏返回值的问题令人不快。 缺少引发检查异常的情况更为严重。 合同是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.joinlong 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 hasnt 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. Well 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 – CallableFuture 。 相关文章 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