Java并发教程–可调用,将来
缺少引發(fā)檢查異常的情況更為嚴(yán)重。 合同是public void run() ,這意味著您必須捕獲受檢查的異常并對(duì)其進(jìn)行處理。 即使您很小心并且將它們存儲(chǔ)起來以供以后驗(yàn)證,也不能強(qiáng)制所有使用此類的類來檢查異常。 您可以遍歷所有的獲取器,并在每個(gè)異常中都存在異常時(shí)拋出該異常 。 除了麻煩之外,即使那也不是萬無一失的。 您無法強(qiáng)制調(diào)用其中任何一個(gè)。 線程程序員會(huì)正確地調(diào)用join()以等待它完成,然后可能會(huì)繼續(xù)前進(jìn)。
不過不用擔(dān)心,多年之后,終于在1.5版本中解決了這個(gè)問題。 通過在上一篇文章中討論的Callable和Future接口的引入以及它們?cè)诰€程池中的支持,這兩個(gè)問題都得到了很好的解決。
可召回
Callable接口聲明公共T call()拋出Exception 。 現(xiàn)在我們可以返回結(jié)果,將其強(qiáng)類型化為實(shí)現(xiàn)中聲明的類型,甚至拋出Exceptions 。 盡管Executors類中有一些實(shí)用程序方法可以如第3部分中所述轉(zhuǎn)換您的Runnable實(shí)例,但最好還是回顧一下您當(dāng)前對(duì)Runnable或Thread子類的實(shí)現(xiàn)。 何必呢? 主要是為了仔細(xì)檢查并刪除可能為解決缺少對(duì)拋出的異常的支持而實(shí)施的變通方法。 同時(shí),您可能希望利用在執(zhí)行方法中直接返回結(jié)果的功能,而無需進(jìn)行強(qiáng)制轉(zhuǎn)換以檢索值。
未來
這是線程池和Callable的組合功能在一起的地方。 Future是1.5中引入的另一個(gè)新接口。 當(dāng)您向一個(gè)線程池提交Callable時(shí) ,將為您提供Future的實(shí)例,該實(shí)例的類型將傳遞給您傳入的Callable 。此對(duì)象替代您在1.5之前使用的實(shí)際Thread實(shí)例。 以前您必須執(zhí)行Thread.join()或Thread.join(long millis) ,現(xiàn)在您可以像本例中那樣使用它們。
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());}}如果決定限制愿意等待完成的時(shí)間,那么現(xiàn)在有了顯式的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 Concurrency Part 4 – Callable,Future 。
相關(guān)文章 :- Java并發(fā)教程–信號(hào)量
- Java并發(fā)教程–重入鎖
- Java并發(fā)教程–線程池
- Java并發(fā)教程–阻塞隊(duì)列
- Java并發(fā)教程– CountDownLatch
- Exchanger和無GC的Java
- Java Fork / Join進(jìn)行并行編程
- 使用迭代器時(shí)如何避免ConcurrentModificationException
- 改善Java應(yīng)用程序性能的快速技巧
翻譯自: https://www.javacodegeeks.com/2011/09/java-concurrency-tutorial-callable.html
總結(jié)
以上是生活随笔為你收集整理的Java并发教程–可调用,将来的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 烤肉怎么吃 烤肉吃的方法
- 下一篇: Java中的数据库架构导航