Java并發教程–可調用,將來

從Java的第一個發行版開始,Java的美麗之處之一就是我們可以輕松編寫多線程程序并將異步處理引入我們的設計中。 Thread類和Runnable接口與Java的內存管理模型結合使用,意味著可以進行簡單的線程編程。 但是,如第3部分所述, Thread類和Runnable接口均不允許拋出Exception或返回值。 缺乏返回值的問題令人不快。

缺少引發檢查異常的情況更為嚴重。 合同是public void run() ,這意味著您必須捕獲受檢查的異常并對其進行處理。 即使您很小心并且將它們存儲起來以供以后驗證,也不能強制所有使用此類的類來檢查異常。 您可以遍歷所有的獲取器,并在每個異常中都存在異常時拋出該異常 。 除了麻煩之外,即使那也不是萬無一失的。 您無法強制調用其中任何一個。 線程程序員會正確地調用join()以等待它完成,然后可能會繼續前進。

不過不用擔心,多年之后,終于在1.5版本中解決了這個問題。 通過在上一篇文章中討論的CallableFuture接口的引入以及它們在線程池中的支持,這兩個問題都得到了很好的解決。

可召回

Callable接口聲明公共T call()拋出Exception 。 現在我們可以返回結果,將其強類型化為實現中聲明的類型,甚至拋出Exceptions 。 盡管Executors類中有一些實用程序方法可以如第3部分中所述轉換您的Runnable實例,但最好還是回顧一下您當前對RunnableThread子類的實現。 何必呢? 主要是為了仔細檢查并刪除可能為解決缺少對拋出的異常的支持而實施的變通方法。 同時,您可能希望利用在執行方法中直接返回結果的功能,而無需進行強制轉換以檢索值。

未來

這是線程池和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 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());}}

如果決定限制愿意等待完成的時間,那么現在有了顯式的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 。

相關文章 :
  • 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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/374080.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374080.shtml
英文地址,請注明出處:http://en.pswp.cn/news/374080.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python基本運算符_06-Python基礎知識學習---基本運算符

算術運算符python支持的算數運算符與數學上計算的符號使用是一致的(x 5 , y 2):算術運算符描述示例兩個對象相加x y 7-兩個對象相減x - y 3*兩個對象相乘x * y 10/除,返回值保留整數和小數部分x / y 2.5//整除,只保留整數部分x // y …

java wait()和sleep() 的區別

之前在寫代碼的時候,如果需要讓線程等待一會,就直接使用sleep()方法,一直也沒有出過問題。而wait()方法的出場率很高,每次打一個句點的時候,對象的方法彈出來,總是能看到wait()在其中,wait()是一…

異常:com.microsoft.sqlserver.jdbc.SQLServerException: 將截斷字符串或二進制數據。

com.microsoft.sqlserver.jdbc.SQLServerException: 將截斷字符串或二進制數據。 at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:196) at com.microsoft.sqlserver.jdbc.TDSTokenHandler.onEOF(tdsparser.java:246) a…

Java中的數據庫架構導航

jOOQ的重要組成部分是數據庫架構導航模塊jooq-meta。 代碼生成器使用它來發現相關的架構對象。 我多次被問到為什么我要自己滾動而不使用其他庫,例如SchemaCrawler或SchemaSpy ,確實很遺憾我不能依賴其他穩定的第三方產品。 以下是有關數據庫架構導航的一…

python自動化測試的工具_python自動化測試(3)- 自動化框架及工具

3 基本示例如下示例也來自于官方文檔 basic_demo.py:# coding:utf-8"""基本的自動化測試腳本 basic_demo.py"""__author__ zhengimport unittestclass TestStringMethods(unittest.TestCase):def setUp(self):print init by setUp…

Html轉Word文檔,解決無法保存網絡圖片的問題

最近項目中需要這個功能,網上有很多word轉html的方法,但是html轉word的方法很少,因為html中的圖片轉換到本地比較麻煩; 開始的時候只能轉換不帶圖片的html內容,但是不符合要求,將html頁面中的圖片改成絕對路…

一不小心就掉大啦《數組使用注意》

今天程序提交答案總是不對,調試半天才發現本定義的是char s[4]{1,2,3,4} ; 程序運行過程中輸出才發現多了一個字符 printf("%s\n"); //結果12349 思前想后覺得可能是沒有字符數組結束符 (\0); 特別注意: 定義使用字符型數組時,應…

Java并發教程–阻塞隊列

如第3部分所述,Java 1.5中引入的線程池提供了核心支持,該支持很快成為許多Java開發人員的最愛。 在內部,這些實現巧妙地利用了Java 1.5中引入的另一種并發功能-阻塞隊列。 隊列 首先,簡要回顧一下什么是標準隊列。 在計算機科學…

json和字符串/數組/集合的互相轉換の神操作總結

一:前端字符串轉JSON的4種方式 1,eval方式解析,恐怕這是最早的解析方式了。 function strToJson(str){var json eval(( str ));return json; } 2,new Function形式,比較怪異哦。 function strToJson(str){var json (new Funct…

python 修改array_python 基礎_ 數組的 增刪改查3

數組是運用在多個數據存在一個變量中的,而在調用的時候可以調用所需要的數組。創建數組a [a,b,c,d,f]   #創建一個數組a其中有5個元素分別是abcdf1.查詢。所謂的查詢就是顯示變量a中一個或是一些元素print (a[1])  #打印出a變量中的序列1的元素,我們…

Android實現推送方式解決方案

Android實現推送方式解決方案 本文介紹在Android中實現推送方式的基礎知識及相關解決方案。推送功能在手機開發中應用的場景是越來起來了,不說別的,就我們手機上的新聞客戶端就時不j時的推送過來新的消息,很方便的閱讀最新的新聞信息。這種推…

NYOJ 2 括號配對問題

括號配對問題 時間限制&#xff1a;3000 ms | 內存限制&#xff1a;65535 KB難度&#xff1a;3描述 現在&#xff0c;有一行括號序列&#xff0c;請你檢查這行括號是否配對。 輸入第一行輸入一個數N&#xff08;0<N<100&#xff09;,表示有N組測試數據。后面的…

您應該對什么進行單元測試? –測試技術3

昨天我在辦公室里&#xff0c;和我的一位同事談論測試&#xff0c;他對編寫單元測試有些不服氣。 他使用的原因之一是有些測試似乎毫無意義&#xff0c;這使我想到了什么是單元測試&#xff0c;什么也不需要打擾。 考慮下面一個簡單的不可變的Name Bean&#xff0c;其中包含一…

java基礎知識系列---垃圾收集

1 為什么要使用垃圾回收機制&#xff1f; “垃圾收集”暗示程序不再需要的對象就是垃圾&#xff0c;可以被丟棄。更精確&#xff0c;更新的說法是“內存回收”。 1.1 新對象的使用 當一個對象不再被程序所引用時&#xff0c;他所使用的堆空間可以被回收&#xff0c;以便于被后續…

經濟

聯合國&#xff0c;美蘇英法中 國家要外匯儲備干什么&#xff1f; 01年加入WTO &#xff0c;美國躲開 WTO 另起爐灶 TPP 諾貝爾經濟學獎得主 克魯格蠻 觸動利益比觸動靈魂還困難 SDR IMF 轉載于:https://www.cnblogs.com/zrui513/p/5014593.html

wxpython的sizer_wxPython BoxSizer布局

Box wx.BoxSizer(wxHORIZONTAL) Box wx.BoxSizer(wxVERTICAL)Add() 方法(從wxSizer繼承)它附加到sizer的下一行/列。Box.Add(control, proportion, flag, border)proportion 參數控制的控件響應于所述容器的尺寸改變其大小。各種flag 參數的組合決定控件在sizer的外觀。下面是…

NYOJ 6 噴水裝置(一)

噴水裝置&#xff08;一&#xff09; 時間限制&#xff1a;3000 ms | 內存限制&#xff1a;65535 KB 難度&#xff1a;3描述 現有一塊草坪&#xff0c;長為20米&#xff0c;寬為2米&#xff0c;要在橫中心線上放置半徑為Ri的噴水裝置&#xff0c;每個噴水裝置的效果都會讓以它為…

如何部署Zabbix服務端

部署環境 RHEL 6.7 Zabbix-server 2.2.14 安裝zabbix官方源 # wget http://repo.zabbix.com/zabbix/2.2/rhel/6/x86_64/zabbix-release-2.2-1.el6.noarch.rpm # rpm -ivh zabbix-release-2.2-1.el6.noarch.rpm 安裝zabbix-server # yum install zabbix zabbix-server-mysql zab…

Google App Engine上的Spring MVC和REST

前段時間&#xff0c;我寫了一篇關于如何使用Spring MVC實現Restful Web API的文章 。 閱讀我以前的文章以了解它。 在那篇文章中&#xff0c;開發了一個簡單的Rest示例。 為了測試該應用程序&#xff0c;將文件復制到Web服務器&#xff08;例如Tomcat &#xff09;中&#xff…

SALT+HASH撒鹽加密

#region 撒鹽加密string salt Guid.NewGuid().ToString();byte[] passwordAndSaltBytes System.Text.Encoding.UTF8.GetBytes(model.Password salt);byte[] hashBytes new System.Security.Cryptography.SHA256Managed().ComputeHash(passwordAndSaltBytes);string hashStr…