南昌做网站优化哪家好,公司制作个网站,国家企业信息系统官方,深入浅出wordpressjava并发调用从Java的第一个发行版开始#xff0c;Java的美丽之处之一就是我们可以轻松编写多线程程序并将异步处理引入我们的设计中。 Thread类和Runnable接口与Java的内存管理模型结合在一起#xff0c;意味着可以直接进行线程编程。 但是#xff0c;如第3部分所述#x… java并发调用 从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并发第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.htmljava并发调用