2012-04-07 39 views

Trả lời

4

Không phải ra khỏi hộp, không có. Thông thường, Reader chỉ thoát ra khỏi một cuộc gọi read() khi một luồng khác đóng luồng bên dưới, hoặc bạn đến cuối đầu vào.

Vì đọc() không phải là tất cả những gì có thể làm gián đoạn, điều này trở thành một vấn đề lập trình đồng thời. Các chủ đề mà biết về thời gian chờ sẽ cần để có thể làm gián đoạn các chủ đề đó là cố gắng để đọc đầu vào.

Về cơ bản, chuỗi đọc sẽ phải thăm dò phương thức ready() của Reader, thay vì bị khóa trong read() khi không có gì để đọc. Nếu bạn quấn thao tác bỏ phiếu và chờ đợi này trong một java.util.concurrent.Future, thì bạn gọi phương thức get() của Future với một thời gian chờ.

Bài viết này đi vào một số chi tiết: http://www.javaspecialists.eu/archive/Issue153.html

12

Một cách hơi dễ dàng hơn để làm điều này hơn câu trả lời Benjamin Cox sẽ làm điều gì đó như

int x = 2; // wait 2 seconds at most 

BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 
long startTime = System.currentTimeMillis(); 
while ((System.currentTimeMillis() - startTime) < x * 1000 
     && !in.ready()) { 
} 

if (in.ready()) { 
    System.out.println("You entered: " + in.readLine()); 
} else { 
    System.out.println("You did not enter data"); 
} 

di chúc này, tuy nhiên tiêu thụ nhiều tài nguyên hơn giải pháp của mình .

+2

BufferedReader.ready() dường như trả về true nếu có sẵn bất kỳ byte nào, không nhất thiết phải bao gồm một dòng mới. Hãy xem xét trường hợp có một nhân vật chờ đợi mà không có một dòng mới. in.ready() trả về true, in.readLine() được gọi, nhưng các khối không giới hạn chờ đợi cho dòng mới. – pendor

+1

@pendor Nhưng tiêu chuẩn 'System.in' sẽ chỉ có dữ liệu nếu người dùng truy cập nhập vào dòng lệnh cung cấp trình tự dòng mới. – Jeffrey

+1

@ Jeffrey là tài liệu ở bất cứ đâu? – Max

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