日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

Java并发教程–可调用,将来

發(fā)布時(shí)間:2023/12/3 java 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java并发教程–可调用,将来 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
從Java的第一個(gè)發(fā)行版開始,Java的美麗之處之一就是我們可以輕松編寫多線程程序并將異步處理引入我們的設(shè)計(jì)中。 Thread類和Runnable接口與Java的內(nèi)存管理模型結(jié)合使用,意味著可以進(jìn)行簡單的線程編程。 但是,如第3部分所述, Thread類和Runnable接口均不允許拋出Exception或返回值。 缺乏返回值的問題令人不快。

缺少引發(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è)問題。 通過在上一篇文章中討論的CallableFuture接口的引入以及它們?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ì)RunnableThread子類的實(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。