淺談java中異步多線程超時(shí)導(dǎo)致的服務(wù)異常
在項(xiàng)目中為了提高大并發(fā)量時(shí)的性能穩(wěn)定性,經(jīng)常會(huì)使用到線程池來(lái)做多線程異步操作,多線程有2種,一種是實(shí)現(xiàn)runnable接口,這種沒(méi)有返回值,一種是實(shí)現(xiàn)Callable接口,這種有返回值。
當(dāng)其中一個(gè)線程超時(shí)的時(shí)候,理論上應(yīng)該不 影響其他線程的執(zhí)行結(jié)果,但是在項(xiàng)目中出現(xiàn)的問(wèn)題表明一個(gè)線程阻塞,其他線程返回的接口都為空。其實(shí)是個(gè)很簡(jiǎn)單的問(wèn)題,但是由于第一次碰到,還是想了一些時(shí)間的。很簡(jiǎn)單,就是因?yàn)樽枞哪莻€(gè)線
程沒(méi)有釋放,并發(fā)量一大,線程池?cái)?shù)量就滿了,所以其他線程都處于等待狀態(tài)。
附上一段自己寫(xiě)的調(diào)試代碼,當(dāng)想不出問(wèn)題的時(shí)候,自己模擬的寫(xiě)寫(xiě),說(shuō)不定問(wèn)題就出來(lái)了。
import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; public class FutureTest { public static void main(String[] args) throws InterruptedException, ExecutionException, TimeoutException { final ExecutorService exec = Executors.newFixedThreadPool(1); Callable<String> call = new Callable<String>() { public String call() throws InterruptedException { // 開(kāi)始執(zhí)行耗時(shí)操作 Thread.sleep(1000 * 2); return "1線程執(zhí)行完成."; } }; Callable<String> call2 = new Callable<String>() { public String call() throws Exception { // 開(kāi)始執(zhí)行耗時(shí)操作 // Thread.sleep(1000 * 5); return "2線程執(zhí)行完成."; } }; Callable<String> call3 = new Callable<String>() { public String call() throws Exception { // 開(kāi)始執(zhí)行耗時(shí)操作 // Thread.sleep(1000 * 5); return "3線程執(zhí)行完成."; } }; Future<String> future = exec.submit(call); Future<String> future3 = exec.submit(call3); Future<String> future2 = exec.submit(call2); String obj=""; String obj2 =""; String obj3 =""; try{ obj = future.get(500, TimeUnit.MILLISECONDS); // 任務(wù)處理超時(shí)時(shí)間設(shè)為 }// 1 秒 catch(Exception e){ System.out.println("處理超時(shí)啦...."); e.printStackTrace(); } try{ obj3 = future3.get(3000, TimeUnit.MILLISECONDS); // 任務(wù)處理超時(shí)時(shí)間設(shè)為 }// 1 秒 catch(Exception e){ System.out.println("處理超時(shí)啦...."); e.printStackTrace(); } try{ obj2 = future2.get(3000, TimeUnit.MILLISECONDS);} catch(Exception e){ System.out.println("處理超時(shí)啦...."); e.printStackTrace(); } System.out.println("3任務(wù)成功返回:" + obj3); System.out.println("2任務(wù)成功返回:" + obj2); System.out.println("1任務(wù)成功返回:" + obj); exec.shutdown(); } }
以上就是小編為大家?guī)?lái)的淺談java中異步多線程超時(shí)導(dǎo)致的服務(wù)異常全部?jī)?nèi)容了,希望大家多多支持腳本之家~
- 解決mysql服務(wù)器在無(wú)操作超時(shí)主動(dòng)斷開(kāi)連接的情況
- 小程序server請(qǐng)求微信服務(wù)器超時(shí)的解決方法
- php中curl和soap方式請(qǐng)求服務(wù)超時(shí)問(wèn)題的解決
- 詳解Nginx服務(wù)器中配置超時(shí)時(shí)間的方法
- Win7系統(tǒng)日志提示在沒(méi)有配置的 DNS 服務(wù)器響應(yīng)之后,名稱“域名”的名稱解析超時(shí)的解放方法
- oracle遠(yuǎn)程連接服務(wù)器出現(xiàn) ORA-12170 TNS:連接超時(shí) 解決辦法
- 使用FileZilla連接時(shí)超時(shí)無(wú)法連接到服務(wù)器
- SNMP4J服務(wù)端連接超時(shí)問(wèn)題解決方案
相關(guān)文章
spring boot與redis 實(shí)現(xiàn)session共享教程
這篇文章主要介紹了spring boot與redis 實(shí)現(xiàn)session共享教程,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-04-04SpringMVC的@InitBinder參數(shù)轉(zhuǎn)換代碼實(shí)例
這篇文章主要介紹了SpringMVC的@InitBinder參數(shù)轉(zhuǎn)換代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09Spring IOC原理補(bǔ)充說(shuō)明(循環(huán)依賴、Bean作用域等)
這篇文章主要介紹了Spring IOC原理補(bǔ)充說(shuō)明(循環(huán)依賴、Bean作用域等),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08mybatis查詢實(shí)現(xiàn)返回List<Map>類型數(shù)據(jù)操作
這篇文章主要介紹了mybatis查詢實(shí)現(xiàn)返回List<Map>類型數(shù)據(jù)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-11-11詳解JAVA 線程-線程的狀態(tài)有哪些?它是如何工作的?
這篇文章主要介紹了詳解JAVA 線程的的相關(guān)資料,文中講解非常細(xì)致,源碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以參考下2020-06-06