2012-02-17 27 views
12

Có ai có thể chỉ cho tôi một số tài liệu hướng dẫn rõ ràng rằng 'Future.get` có thời gian chờ là 0 sẽ không đợi?Hành vi của future.get với thời gian chờ là

Tài liệu API cho java.util.concurrent.Future không làm rõ hành vi của future.get(0, unit). Tự mình đứng lên, tuyên bố "Chờ đợi nếu cần thiết cho hầu hết thời gian nhất định ..." ngụ ý lời kêu gọi này sẽ không chờ đợi chút nào, nhưng với hành vi lâu dài của Object.wait(0) (chờ đợi vô hạn), tôi lo lắng phụ thuộc trên cơ sở "không chờ đợi" hành vi của future.get(0, unit)

quét nguồn gốc của một số lớp JDK-cung cấp (tức. FutureTask) tôi thấy rằng việc thực hiện đặc biệt này của Future không đợi khi thời gian chờ là 0.

tôi d muốn có thể nói

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

nhưng tôi lo lắng về tương lai thực hiện đó là một chờ đợi vô hạn, vì vậy thay vào đó, tôi đã mã hoá nó một cách rõ ràng cách tôi mong chờ nó để làm việc:

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

@skaffman Cảm ơn bạn đã sửa thẻ. – mwhidden

Trả lời

7

Chờ đợi nếu cần thiết cho tối đa thời gian đã định & hellip;

Đang chờ tối đa đơn vị thời gian bằng 0 không chờ đợi chút nào. Đó không phải là một gợi ý ngầm, đó là một sự bảo đảm rõ ràng.

+3

Đã cấp. Tôi nghĩ rằng sự khác biệt này trong ngữ nghĩa từ 'Object.wait (long)' sẽ bảo đảm một số khác biệt rõ ràng trong tài liệu. Ngay cả 'Object.wait' lúc đầu dường như đảm bảo không chờ đợi" 'timeout' - thời gian tối đa để chờ trong mili giây" nhưng sau đó backpedals và nói "Nếu' timeout' là zero, tuy nhiên, sau đó thời gian thực không được xem xét và sợi chỉ đơn giản chờ cho đến khi được thông báo. " – mwhidden

5

tôi có thể chỉ cho bạn tại một số mã nếu giúp. Nhìn vào java.util.concurrent.FutureTask và sau đó đến AbstractQueuedSynchronizer tôi thấy vòng lặp sau đây mà tôi đã pared xuống để hiển thị các bit relavent:

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

Điều này có nghĩa rằng nếu nanosTimeout là 0 (mà nó sẽ được nếu bạn vượt qua trong 0 đến nhận được) sau đó nó sẽ cố gắng để có được tương lai một lần và sau đó thời gian chờ và trả về false.

Nếu nó giúp bạn cảm thấy tốt hơn, bạn có thể đặt thời gian chờ là 1 nano giây.

+0

Cảm ơn! Đó chính xác là mã tôi đã xem xét trong quá trình nghiên cứu của riêng tôi. – mwhidden

Các vấn đề liên quan