線程池中如何控制超時時間?


 

線程池構造方法不能控制任務的超時時間

 java.util.concurrent.ThreadPoolExecutor#ThreadPoolExecutor(int, int, long, java.util.concurrent.TimeUnit, java.util.concurrent.BlockingQueue<java.lang.Runnable>)

 long, java.util.concurrent.TimeUnit設置的是超過core數量的線程在沒有任務時最大的idleTime

 

但是執行任務時可以使用Future類來控制超時時間

AbstractExecutorService中invokeAll,invokeAny可以指定超時時間 (沒有完成的task會被cancel,並拋出interrupted異常), 但其本質還是使用Future.cancle

這里不是對單個task的超時控制

 

 

 

 另起一個SchedulerThread監控FutureTask是否超時,@Hystrix的超時原理

http://westyi.iteye.com/blog/714935

 cancle不一定成功,無法判端里面的事務是否真的失敗, 只是在確定超時后 返回了一個備用對象

 

Executors 返回的線程池對象的弊端如下:

1)FixedThreadPool 和 SingleThreadPool: 允許的請求隊列長度為 Integer.MAX_VALUE,可能會堆積大量的請求,從而導致 OOM

2)CachedThreadPool 和 ScheduledThreadPool: 允許的創建線程數量為 Integer.MAX_VALUE,可能會創建大量的線程,從而導致 OOM

 

 

 

線程Thread

線程工廠 ThreadFactory

線程池  正確的概念是指ThreadPoolExecutor,  注意父類AbstractExecutorService, ExecutorService中超時方法的使用

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM