2010-05-05 9 views
7

Tôi muốn làm một yêu cầu HTTP và sau đó nhận được câu trả lời như phác thảo đây:Chặn bộ đệm Java BufferedReader?

URLConnection c = new URL("http://foo.com").openConnection(); 
c.setDoOutput(true); 

/* write an http request here using a new OutputStreamWriter(c.getOutputStream) */ 

BufferedReader reader = new BufferedReader(new InputStreamReader(c.getInputStream)); 
reader.readLine(); 

Nhưng câu hỏi của tôi là, nếu yêu cầu tôi gửi mất một thời gian dài trước khi nhận được phản hồi, những gì xảy ra trong cuộc gọi reader.readLine() ở trên? Liệu quá trình này có tiếp tục chạy/chạy được trên CPU hay không, nó sẽ được lấy ra khỏi CPU và được thông báo để thức dậy và chạy lại khi có IO được đọc?

Nếu nó vẫn ở trên CPU, bạn có thể làm gì để làm cho nó được tắt và được thông báo sau?

+6

Có bất kỳ câu trả lời nào trong số những câu trả lời này giải thích đầy đủ câu hỏi của bạn không? Nếu vậy, bạn có lẽ nên đánh dấu một câu trả lời được chấp nhận của bạn. Nếu không, chỉ cần chỉnh sửa câu hỏi của bạn để giải thích những gì vẫn chưa rõ ràng. – jasonmp85

Trả lời

-3

Một hệ điều hành tốt sẽ có một trình lên lịch đưa quá trình vào trạng thái bị chặn hoặc tương tự và mọi công tắc nhiệm vụ sẽ không chuyển sang quy trình bị chặn.

Ví dụ: Quy trình nhàn rỗi trong cửa sổ là những gì chạy khi không có quy trình nào sẵn sàng chạy (ngủ, bị chặn, v.v.).

21

Những gì người khác đã nói là chính xác. Thư viện "cũ I/O" của Java trong java.io chứa các cuộc gọi chặn. Nhưng họ không bận chờ đợi. Họ đang chặn trên I/O và hạt nhân sẽ lên lịch lại cho họ một lần nữa I/O có sẵn.

Tôi đã không hoàn toàn chắc chắn, vì vậy tôi đã thử nó cho bản thân mình. Hãy học lớp mẫu này:

import java.io.*; 

public class Test { 

    public static void main(String[] args) throws IOException { 
    BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); 

    String line = reader.readLine(); 
    System.out.println(line); 
    } 
} 

Và biên dịch nó trên dòng lệnh. Sau đó chạy nó, nhưng không gõ bất cứ điều gì. Chương trình sẽ chặn trên đầu vào cho đến khi bạn nhập một ký tự và chương trình sẽ không tiến hành đọc trước cho đến khi bạn nhập. ps sẽ có thể cho chúng tôi biết thêm chi tiết về quy trình này. Sử dụng các a cờ để có được thông tin chi tiết từ ps:

[email protected]<computer-name>] ps a 
    PID TT STAT  TIME COMMAND 
3846 s000 S  0:00.16 -zsh 
3992 s000 S+  0:00.40 /usr/bin/java Test 

Các man page của PS nói:

bang Nhà nước được đưa ra bởi một chuỗi các ký tự, ví dụ, `` RWNA ''. Ký tự đầu tiên cho biết tình trạng hoạt động của các quá trình :

  • tôi Marks một quá trình mà là nhàn rỗi (ngủ lâu hơn khoảng 20 giây).
  • R Đánh dấu quá trình chạy được.
  • S Đánh dấu quá trình đang ngủ ít hơn khoảng 20 giây.

Và kể từ khi tôi chỉ mới bắt đầu quá trình này, S có ý nghĩa. Quá trình đang ngủ, đang chờ lên lịch bởi hệ điều hành. Thật vậy, nếu bạn kiểm tra top, bạn sẽ nhận thấy quá trình đang lấy CPU 0%.

Vì vậy, đừng lo lắng về hiệu suất của cuộc gọi này, không có bận chờ đợi hoặc bỏ phiếu đang diễn ra: hệ thống đang chăm sóc các sự kiện I/O cho bạn và sẽ xử lý thông minh quá trình của bạn.