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){
}
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){
}
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();
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
Xin cảm ơn, hãy xem bản chỉnh sửa. –
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.
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.
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ờ)
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