2013-11-01 12 views
10

Tôi có một vòng lặp while và tôi muốn nó thoát sau một thời gian đã trôi qua.Làm thế nào để thoát khỏi vòng lặp while sau một thời gian nhất định?

Ví dụ:

while(condition and 10 sec has not passed){ 

} 
+3

Từ đoán của tôi, những gì bạn đang tìm kiếm này là: http://stackoverflow.com/questions/4252187/ làm thế nào để dừng lại-thực hiện-sau-một-nhất định-thời gian-trong-java # answer-4252197 – sPaz

Trả lời

22
long startTime = System.currentTimeMillis(); //fetch starting time 
while(false||(System.currentTimeMillis()-startTime)<10000) 
{ 
    // do something 
} 

Do đó, tuyên bố

(System.currentTimeMillis()-startTime)<10000 

Kiểm tra nếu nó đã được 10 giây hoặc 10.000 mili giây kể từ khi vòng lặp bắt đầu.

EDIT

Như @Julien chỉ ra, điều này có thể thất bại nếu mã khối của bạn bên trong vòng lặp while mất rất nhiều time.Thus sử dụng ExecutorService sẽ là một lựa chọn tốt.

Đầu tiên chúng ta sẽ phải thực hiện Runnable

class MyTask implements Runnable 
{ 
    public void run() { 
     // add your code here 
    } 
} 

Sau đó, chúng ta có thể sử dụng ExecutorService như thế này,

ExecutorService executor = Executors.newSingleThreadExecutor(); 
executor.invokeAll(Arrays.asList(new MyTask()), 10, TimeUnit.SECONDS); // Timeout of 10 seconds. 
executor.shutdown(); 
+1

Như đã giải thích trong câu trả lời của tôi, mã này sẽ không làm các trick. Nó có thể chạy không xác định nếu mã trong vòng lặp mất thời gian vô hạn. – Julien

+0

Xin cảm ơn, hãy xem bản chỉnh sửa. –

7

Cái gì như:

long start_time = System.currentTimeMillis(); 
long wait_time = 10000; 
long end_time = start_time + wait_time; 

while (System.currentTimeMillis() < end_time) { 
    //.. 
} 

Nên làm các trick. Nếu bạn cần các điều kiện khác thì chỉ cần thêm chúng vào câu lệnh while.

10

giải pháp được đề xuất và được chấp nhận sẽ không làm các trick.

Nó sẽ không dừng vòng lặp sau 10 giây. Hãy tưởng tượng mã trong vòng lặp của bạn mất 20 giây để xử lý và được gọi là 9,9 giây. Mã của bạn sẽ thoát sau 29.9 giây thực thi.

Nếu bạn muốn dừng chính xác sau 10 giây, bạn phải thực thi mã của mình trong một chuỗi bên ngoài mà bạn sẽ giết sau một thời gian chờ nhất định.

giải pháp hiện tại đã được đưa ra herethere

0

Không sử dụng này

System.currentTimeMillis()-startTime 

Nó có thể gây treo trên sự thay đổi thời gian máy chủ. sử dụng tốt hơn theo cách này:

Integer i = 0; 
      try { 
       while (condition && i++ < 100) { 
        Thread.sleep(100); 
       } 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 

(100 * 100 = 10 giây thời gian chờ)

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