2013-11-14 18 views
6

Tôi có một câu hỏi rất cơ bản. Nếu một luồng đang bận trong thao tác IO thì tại sao nó không được xem xét trong trạng thái RUNNING? Nếu hoạt động IO mất nhiều thời gian, điều đó có nghĩa là luồng đang hoạt động. Làm thế nào một thread có thể được gọi là BLOCKED khi nó thực sự đang làm việc đó?Chủ đề Java - trạng thái bị chặn

+0

việc kiểm tra này http://stackoverflow.com/questions/13596997/why-is-the- cpu-not-needed-to-service-io-yêu cầu – Changgeng

+0

Nó không làm bất kỳ công việc nào, nó không chạy trên lõi, nó đang sử dụng không có CPU, do đó, xem xét nó 'CHẠY' không chính xác phù hợp! –

+0

Có thể bạn nhầm lẫn cụm từ "bị chặn" trong ngữ cảnh chủ đề, với "chặn hoạt động I/O" có nghĩa là có một chút khác biệt. – BartoszKP

Trả lời

4

Tôi không biết nơi bạn đọc một chuỗi đang ở trạng thái BLOCKED khi thực hiện IO. BLOCKED state documentation nói:

Trạng thái chủ đề cho một chuỗi bị chặn đang chờ khóa màn hình. Một luồng trong trạng thái bị chặn đang chờ một khóa màn hình để nhập một khối/phương thức được đồng bộ hóa hoặc nhập lại một khối/phương thức đã đồng bộ sau khi gọi Object.wait.

Vì vậy, không, chuỗi không ở trạng thái bị chặn trong khi thực hiện IO (trừ khi đọc hoặc viết bắt buộc phải đợi trên màn hình của đối tượng).

4

Nếu bạn chạy đoạn mã sau với một sợi chặn trên IO

public class Main { 
    public static void main(String[] args) throws InterruptedException { 
     final Thread thread = new Thread(new Runnable() { 
      @Override 
      public void run() { 
       // blocking read 
       try { 
        System.in.read(); 
       } catch (IOException e) { 
        throw new AssertionError(e); 
       } 
      } 
     }); 
     thread.start(); 
     for(int i=0;i<3;i++) { 
      System.out.println("Thread status: "+thread.getState()); 
      Thread.sleep(200); 
     } 
     System.exit(0); 
    } 
} 

in

Thread status: RUNNABLE 
Thread status: RUNNABLE 
Thread status: RUNNABLE 
+0

Vì vậy, trạng thái luồng là 'RUNNABLE' khi chặn IO không là gì ngoài việc chiếm thời gian của CPU, không làm gì ngoài việc chờ phản hồi IO. Phải không? – overexchange

+0

@overexchange khi một luồng đang chặn, nó không sử dụng CPU (trừ khi vào và thoát khỏi chế độ này) Sự nhầm lẫn là do thực tế JVM không biết khi nào một cuộc gọi hệ thống chặn được thực hiện khi hệ điều hành quyết định điều này . –

+0

Mặc dù lát thời gian được phân bổ, luồng chặn IO, không yêu cầu CPU cho lát thời gian đó, điều này được hiểu, nhưng không có luồng nào khác đang sử dụng CPU đó, cho lát thời gian đó. Phải không? – overexchange

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