簡體   English   中英

如何實現類似於嘗試獲取值的東西,如果為null,則在不使用Thread.sleep的情況下稍微睡一會兒?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM