2012-02-17 16 views
12

के साथ future.get का व्यवहार क्या कोई मुझे कुछ दस्तावेज पर इंगित कर सकता है जो स्पष्ट करता है कि 0 के टाइमआउट के साथ 'भविष्य.get`' इंतजार नहीं करेगा?0 timeout

java.util.concurrent.Future के लिए API दस्तावेज़ future.get(0, unit) का व्यवहार स्पष्ट नहीं करते हैं। अपने आप पर खड़े होकर, बयान "सबसे अधिक समय के लिए आवश्यक होने पर प्रतीक्षा करता है ..." का तात्पर्य है कि यह आमंत्रण बिल्कुल इंतजार नहीं करेगा, लेकिन Object.wait(0) (अनंत प्रतीक्षा) के लंबे समय से व्यवहार को देखते हुए, मैं निर्भर होने के लिए परेशान हूं कुछ JDK-प्रदान की कक्षाएं (अर्थात। FutureTask) मुझे लगता है कि Future के इस विशेष कार्यान्वयन जब टाइमआउट 0.

मैं है इंतजार नहीं करता है के स्रोत स्कैनिंग future.get(0, unit)

की एक "कोई प्रतीक्षा" व्यवहार पर डी

long timeout = Math.max(until - now, 0); 
    return future.get(timeout, TimeUnit.MILLISECONDS); 

लेकिन मैं भविष्य के बारे में परेशान हूं को लागू करने कि एक अनंत प्रतीक्षा के रूप में है, तो बजाय, मैं स्पष्ट रूप से इसे जिस तरह से मैं इसे काम करने के लिए उम्मीद करेंगे कोड जोड़ने के बाद:

long timeout = Math.max(until - now, 0); 
    if(timeout > 0 || future.isDone()){ 
     return future.get(timeout, TimeUnit.MILLISECONDS); 
    } else { 
     throw TimeoutException(); 
    } 
+0

@skaffman टैग फ़िक्सअप के लिए धन्यवाद। – mwhidden

उत्तर

7

अधिकतर समय और नरक पर आवश्यक होने पर प्रतीक्षा करता है;

की प्रतीक्षा शून्य समय इकाइयों की प्रतीक्षा नहीं कर रहा है। यह एक अंतर्निहित संकेत नहीं है, यह एक स्पष्ट गारंटी है।

+3

अनुमोदित। मैंने सोचा कि 'ऑब्जेक्ट.वाइट (लांग)' से अर्थशास्त्र में यह अंतर दस्तावेज़ों में किए गए कुछ स्पष्ट भेद की आवश्यकता होगी। यहां तक ​​कि 'ऑब्जेक्ट.वाइट' पहले भी प्रतीक्षा नहीं करता है "टाइमआउट' - मिलीसेकंड में प्रतीक्षा करने का अधिकतम समय" लेकिन फिर बैकपीडल्स और कहता है, "यदि' टाइमआउट' शून्य है, तो वास्तविक समय को ध्यान में नहीं रखा जाता है और थ्रेड बस अधिसूचित होने तक इंतजार कर रहा है। " – mwhidden

5

मैं कुछ कोड में आप इंगित कर सकते हैं कि अगर मदद करता है। java.util.concurrent.FutureTask में देख और फिर AbstractQueuedSynchronizer लिए मैं निम्नलिखित पाश जो मैं नीचे मुकाबले गया है प्रासंगिक बिट्स को दिखाने के लिए देखने पर:

private boolean doAcquireSharedNanos(int arg, long nanosTimeout) { 
    long lastTime = System.nanoTime(); 
    for (;;) { 
     ... 
     if (nanosTimeout <= 0) { 
      cancelAcquire(node); 
      return false; 
     } 
     long now = System.nanoTime(); 
     nanosTimeout -= now - lastTime; 
    } 

इसका मतलब यह है कि अगर nanosTimeout 0 है (यदि आप करने के लिए 0 में पारित जो यह हो जाएगा प्राप्त करें) तो यह भविष्य को एक बार और फिर टाइमआउट हासिल करने और झूठी वापसी करने का प्रयास करेगा।

यदि यह आपको बेहतर महसूस करता है, तो आप अपना टाइमआउट 1 नैनोसेकंड निर्धारित कर सकते हैं।

+0

धन्यवाद! यह वही कोड है जिसकी मैंने समीक्षा अपने शोध के दौरान की थी। – mwhidden

संबंधित मुद्दे