2015-10-22 19 views
5

Sau đây là đoạn:Đây có phải là ngắt() cần thiết không?

public class LogService { 

    public void stop() { 
     synchronized (this) { isShutdown = true; } 
     loggerThread.interrupt(); /* Is it necesarry? */ 
    } 

    public void log(String msg) throws InterruptedException { 
     synchronized (this) { 
      if (isShutdown) 
      throw new IllegalStateException(...); 
      ++reservations; 
     } 
     queue.put(msg); 
    } 

    private class LoggerThread extends Thread { 
     public void run() { 
      try { 
       while (true) { 
        try { 
         synchronized (LogService.this) { 
          if (isShutdown && reservations == 0) 
           break; 
         } 
         String msg = queue.take(); 
         synchronized (LogService.this) { 
         --reservations; 
         } 
         writer.println(msg); 
        } catch (InterruptedException e) { } /* Do nothing */ 
       } 
      } finally { 
       writer.close(); 
      } 
     } 
    } 
} 

Như đoạn code trên, Thậm chí nếu chúng ta đặt LoggerThread.interrupt() trong stop() phương pháp, sự gián đoạn chỉ được đánh bắt bởi thread và không làm gì cả.

Vì vậy, là LoggerThread.interrupt() cần thiết?

Trả lời

6

Có cần thiết không. Nếu hàng đợi trống, tuyên bố này String msg = queue.take(); sẽ chặn cho đến khi một phần tử được đặt trong hàng đợi hoặc nó bị gián đoạn.

Nếu bạn muốn đảm bảo rằng chuỗi không bị treo, bạn cần phải ngắt nó.

Tuy nhiên có vẻ là một trục trặc: nếu reservations không phải là 0 khi bạn gọi phương thức close VÀ hàng đợi rỗng, dường như vòng lặp của bạn sẽ tiếp tục đi và treo trên queue.take() tại trong khi vòng lặp sau khi bị gián đoạn.

+1

Xóa câu trả lời của tôi là câu trả lời chính xác hơn. –

+0

Vì vậy, 'InterruptedException' có thể được chuyển tới' queue.take() '? – user2916610

+0

@ user2916610 ngoại lệ không được chuyển cho phương thức - mã trong 'queue.take()' kiểm tra xem luồng có bị gián đoạn một cách thường xuyên và ném ra một InterruptedException nếu luồng bị gián đoạn hay không. – assylias

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