2011-12-21 44 views
11

Làm cách nào để trì hoãn một vòng lặp trong một khoảng thời gian 1 giây mà không làm chậm toàn bộ mã/máy tính mà nó đang chạy đến độ trễ một giây (chỉ một vòng lặp nhỏ).Java Trì hoãn/Chờ

+0

_không làm chậm toàn bộ mã_ xây dựng số này –

+0

@JigarJoshi Tôi đang cố trì hoãn vòng lặp này trong khoảng thời gian 1 giây cho plugin Minecraft của mình. Nhưng hầu hết các phương thức chờ đợi tạm dừng toàn bộ máy chủ trong khoảng thời gian đã đặt, thay vì chỉ vòng lặp –

+0

bạn muốn thực hiện vòng lặp while trong một khoảng thời gian cố định và sau đó lại trong thời gian trễ cố định. –

Trả lời

24

Thread.sleep(1000); // do nothing for 1000 miliseconds (1 second)

+0

Sẽ không tạm dừng toàn bộ tập lệnh/máy tính này? –

+2

Điều này sẽ chỉ tạm dừng chủ đề cụ thể mà mã này đang chạy. máy tính của bạn sẽ không bị đóng băng –

11

Dường như vòng lặp của bạn chạy trên chủ đề chính và nếu bạn làm sleep về chủ đề đó nó sẽ tạm dừng các ứng dụng (vì chỉ có một thread đã được tạm dừng), để khắc phục điều này bạn có thể đặt mã này trong mới Thread rằng chạy song song

try{ 

    Thread.sleep(1000); 
}catch(InterruptedException ex){ 
    //do stuff 
} 
+0

hoạt động này hoàn toàn – ERJAN

1

Như Jigar đã chỉ ra bạn có thể sử dụng chủ đề khác để làm công việc mà có thể hoạt động, ngủ vv một cách độc lập của chủ đề khác. Lớp học java.util.Timer cũng có thể giúp bạn vì nó có thể thực hiện các tác vụ định kỳ cho bạn mà không cần phải tham gia vào chương trình đa luồng.

2

Cách đơn giản của tôi để trì hoãn vòng lặp.

Tôi đã đặt mã ở đây sau khi không tuân thủ các tiêu chuẩn của lưu lượng truy cập của stackoverflow.

//1st way: Thread.sleep : Less efficient compared to 2nd 
try { 
    while (true) {//Or any Loops 
    //Do Something 
    Thread.sleep(sleeptime);//Sample: Thread.sleep(1000); 1 second sleep 
    } 
} catch (InterruptedException ex) { 
    //SomeFishCatching 
} 
//================================== Thread.sleep 


//2nd way: Object lock waiting = Most efficient due to Object level Sync. 
Object obj = new Object(); 
try { 
    synchronized (obj) { 
    while (true) {//Or any Loops 
    //Do Something 
    obj.wait(sleeptime);//Sample obj.wait(1000); 1 second sleep 
    } 
    } 
} catch (InterruptedException ex) { 
    //SomeFishCatching 
} 
//=============================== Object lock waiting 

//3rd way: Loop waiting = less efficient but most accurate than the two. 
long expectedtime = System.currentTimeMillis(); 
while (true) {//Or any Loops 
    while(System.currentTimeMillis() < expectedtime){ 
    //Empty Loop 
    } 
    expectedtime += sleeptime;//Sample expectedtime += 1000; 1 second sleep 
    //Do Something 
} 
//===================================== Loop waiting 
+0

Tôi thích cách thứ ba, bởi vì nó có thể ức chế toàn bộ lõi cpu và không ai sẽ gọi _ever_ này là một mùi mã. – Tom

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