[英]How to implement something like Try to get a value, if null then sleep a little without using Thread.sleep?
在我的應用程序的某一點上,我需要一個緩存(一個HashMap,即)來獲取一個值。 如果該值不存在,我需要稍等一會再試一次。 目前,這是這樣實現的:
String result = cache.get(key);
for (int i = 0; result == null; i++) {
try {
Thread.sleep(5);
} catch (InterruptedException e) {
}
result = cache.get(key);
}
雖然它有效,但我覺得使用Thread.sleep
有點假。 JDK是否為這類任務提供了任何東西? 我想過使用ScheduledExecutorService
,但問題是它必須在主線程中運行。
我認為你的設計存在根本問題。 盡管存在鎖定和內存可見性問題,但您實際上是使用高級代碼輪詢事件。 這既不是有效的,也不是非常敏感的延遲。
您應該切換到更加事件驅動的方法。 至少,使用對象監視器或鎖來等待設置該值,而不是輪詢。
更好的是,使用消息總線注冊處理程序並處理事件 - 您可以使用任何BlockingQueue實現輕松構建多線程消息總線以傳遞消息對象。
嘗試使用BlockingQueue作為緩存。
如果你真的必須在主線程上執行,我不認為Thread.sleep有任何關系。
其他可能性是使用Object.wait()
。 它幾乎就像Thread.sleep()
,但支持通過在同一監視器上調用notify()
來中斷。
其他可能性是用戶java.util.Timer
=(正如@Hovercraft Full Of Eels已經提到的那樣)
您可以使用自填充緩存 (guava LoadingCache ),因此get(...)將阻塞,直到獲取數據。
將它與ExecutorService相結合 - > Future#get(long timeout, TimeUnit unit)
你也可能有超時。
希望我指出你正確的方向:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.