2012-02-17 15 views
12

Beni bir zaman aşımına uğrayan bir "Future.get" in beklemeyeceğini belirten bazı belgelere işaret edebilir misiniz?0 zaman aşımı ile future.get davranışı

java.util.concurrent.Future için API belgeleri, future.get(0, unit) davranışını açık bir şekilde ifade etmez. Kendi başına ayakta durduğumda, "Verilen zamanın çoğunda gerekli olursa ..." ifadesi, bu çağrının hiç beklemeyeceğini ima eder, fakat Object.wait(0) (sonsuz bekleyiş) uzun süredir devam eden davranışı göz önüne alındığında, bağımlı olduğum için gerginim. (yani. FutureTask) Ben aşımı Ben 0.

olduğunda Future bu özel uygulama beklememesi anlamına bakın bazı JDK sağlanan sınıfların kaynağını Tarama future.get(0, unit)

bir "hayır bekle" davranışı üzerinde d

deyin, ama bir Gelecek konusunda gerginim sonsuz bir bekleme olarak, bunun yerine, açıkça bunu Devam etsin diye beklediğiniz şekilde kodlanmış ettik uygulanması: Eğer yardımcı olur bazı kodlara işaret edebilir

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

@skaffman Etiket düzeltmesi için teşekkürler. – mwhidden

cevap

7

Belirli bir süre için gerekliyse & hellip;

en sıfır zaman biriminde bekliyorum hiç beklemiyor. Bu örtük bir ipucu değil, açık bir garanti.

+3

Verilen. Object.wait (uzun) 'dan gelen anlambilimindeki bu farkın, dokümanlardaki bazı belirgin ayrımı garanti ettiğini düşünmüştüm. 'Object.wait' bile ilk başta "timeout" - milisaniye cinsinden beklenecek maksimum süreyi garanti etmemekte gibi görünüyor, ancak backpedals ve "Timeout" sıfır ise, ancak gerçek zaman dikkate alınmıyor. iş parçacığı bildirilene kadar bekler. " – mwhidden

5

. java.util.concurrent.FutureTask içine bakıyor ve sonra AbstractQueuedSynchronizer için ben relavent bit göstermek için kırpılmış ettik aşağıdaki döngü bakın tarih:

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; 
    } 

Bu demektir ki nanosTimeout sen 0 geçmek eğer olacak (0 ise o zaman geleceği bir kez edinmeye çalışacak ve sonra zaman aşımı ve yanlış geri dönecektir.

Daha iyi hissetmeniz durumunda, zaman aşımınızı 1 nanoscond olarak ayarlayabilirsiniz.

+0

Teşekkürler! Tam olarak kendi araştırmam sırasında gözden geçirdiğim kod. – mwhidden