2012-01-09 50 views
19

Tôi nhận thấy rằng NetBeans đang cảnh báo tôi về việc sử dụng Thread.sleep() trong một vòng lặp while trong mã Java của tôi, vì vậy tôi đã thực hiện một số nghiên cứu về chủ đề này. Có vẻ như vấn đề chính là một trong những hoạt động, nơi mà tình trạng trong khi của bạn có thể trở thành sự thật trong khi bộ đếm vẫn đang ngủ, do đó lãng phí thời gian đồng hồ treo tường khi bạn đợi cho lần lặp tiếp theo. Điều này tất cả làm cho cảm giác hoàn hảo.Thread.sleep() trong một vòng lặp while

Ứng dụng của tôi có nhu cầu liên hệ với hệ thống từ xa và thăm dò định kỳ trạng thái của một thao tác, đợi cho đến khi hoàn thành thao tác trước khi gửi yêu cầu tiếp theo. Tại thời điểm này mã logic thực hiện điều này:

String state = get state via RPC call 
while (!state.equals("complete")) { 
    Thread.sleep(10000); // Wait 10 seconds 
    state = {update state via RPC call} 
} 

Cho rằng hoàn cảnh đang kiểm tra một hoạt động từ xa (mà là một quá trình khá tốn kém, trong đó nó chạy trong vài giây), là này một sử dụng hợp lệ của Chủ đề. sleep() trong một vòng lặp while? Có cách nào tốt hơn để cấu trúc logic này? Tôi đã nhìn thấy một số ví dụ mà tôi có thể sử dụng một lớp Timer, nhưng tôi không nhìn thấy lợi ích, vì nó vẫn có vẻ sôi xuống cùng một logic đơn giản ở trên, nhưng với rất nhiều phức tạp hơn ném vào.

Bear ghi nhớ rằng hệ thống từ xa trong trường hợp này không thuộc quyền kiểm soát trực tiếp của tôi, cũng không phải được viết bằng Java, vì vậy việc thay đổi kết thúc đó trở nên "hợp tác" hơn trong kịch bản này không phải là một lựa chọn. Tùy chọn duy nhất của tôi để cập nhật giá trị của ứng dụng cho trạng thái là tạo và gửi một tin nhắn XML, nhận phản hồi, phân tích cú pháp và sau đó trích xuất thông tin tôi cần.

Mọi đề xuất hoặc nhận xét sẽ được chào đón nhiều nhất.

+0

Tôi nghĩ rằng trong tình huống của bạn nó là hoàn toàn đúng (nếu bạn không thể nhận được thông báo khi có cuộc gọi rpc xong). Cách để nhận được xung quanh cảnh báo đang sử dụng làm trong khi chu kỳ. – kenota

+2

Tôi nghĩ rằng chi phí bỏ phiếu cho nhà nước của cuộc gọi RPC cần phải được khá cao để đảm bảo một giấc ngủ 10 giây. Một giây sẽ hợp lý hơn, hoặc một giấc ngủ chờ lâu hơn tùy thuộc vào số lượng các hoạt động ngủ trước đó (với mức tối đa nhất định của khóa học). –

+1

Như tôi đã lưu ý, hoạt động từ xa chạy trong vài giây (theo đó tôi muốn nói ở bất cứ đâu từ 3-5). Với một số trường hợp cạnh, có một trường hợp phải được thực hiện rằng 10 giây là quá ngắn. –

Trả lời

12

Trừ khi hệ thống từ xa của bạn có thể phát hành sự kiện hoặc thông báo cho bạn một cách không đồng bộ, tôi không nghĩ rằng điều trên là không hợp lý. Bạn cần phải cân bằng thời gian sleep() so với thời gian/tải mà cuộc gọi RPC thực hiện, nhưng tôi nghĩ đó là vấn đề duy nhất và ở trên dường như không đáng lo ngại chút nào.

4

Không thể thay đổi đầu cuối từ xa để cung cấp thông báo "đẩy" được thực hiện với quy trình chạy dài của nó, đó là về việc bạn sẽ có thể thực hiện. Miễn là thời gian Thread.sleep dài so với chi phí bỏ phiếu, bạn sẽ không sao.

0

Bạn nên (hầu như) không bao giờ sử dụng giấc ngủ vì nó rất kém hiệu quả và thực hành không tốt. Luôn sử dụng các khóa và các biến điều kiện trong đó các luồng tín hiệu với nhau. Xem Mike Dahlin của Coding Standards for Programming with threads

Mẫu là:

public class Foo{ 
    private Lock lock; 
    private Condition c1; 
    private Condition c2; 

    public Foo() 
    { 
    lock = new SimpleLock(); 
    c1 = lock.newCondition(); 
    c2 = lock.newCondition(); 
    ... 
    } 

    public void doIt() 
    { 
    try{ 
     lock.lock(); 
     ... 
     while(...){ 
     c1.awaitUninterruptibly(); 
     } 
     ... 
     c2.signal(); 
    } 
    finally{ 
     lock.unlock(); 
    } 
    } 
} 
+3

Tôi không hoàn toàn chắc chắn như thế nào đây là vụ phải giúp đỡ. –

+0

Vâng, tôi nghĩ anh ta hỏi về cách cấu trúc logic của anh ấy và tôi đang nói (bên trong bình luận chung) bên trong vòng lặp while, anh ta nên sử dụng biến điều kiện để báo hiệu bởi quá trình chờ đợi được hoàn thành thay vì liên tục sử dụng ngủ. – Cemre

+2

Tôi nghĩ rằng điều này bỏ qua các vấn đề thực tế rằng RPC cần phải được thăm dò trong một số thời trang, phải không? –

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