Tôi sử dụng ProcessBuilder
để chạy quy trình. Tôi xử lý các luồng đầu vào/đầu ra bằng cách gửi các runnables tương ứng xử lý chúng trong một nhóm luồng (Executors.newCachedThreadPool()
).
Tôi nhận được kết quả nhưng hiện tại tôi không nhận được gì cả.
Ví dụ: nếu tôi làm: cmd \C dir
cho người xây dựng quy trình, tôi nhận được kết quả của dir
trở lại nhưng đôi khi tôi không nhận được bất kỳ thứ gì (mặc dù kết quả có vẻ như trở lại từ runnable xử lý process.getInputStream
).
Tôi làm cách nào để gỡ lỗi này? Nó xuất hiện liên tục. Với cùng mã tôi không có bất kỳ vấn đề gì khi tôi đã làm new Thread(runnable).start()
. Nó bắt đầu xảy ra sau khi tôi chuyển sang một hồ bơi thread.Vấn đề đồng thời giữa chờ đợi quy trình và đọc luồng?
Cập nhật:
Tôi nghĩ rằng tôi tìm thấy một cái gì đó:
tôi làm như sau trong Runnable
:
try {
while ((line = br.readLine()) != null) {
pw.println(line);
sb.append(line);
}
System.out.println("Finished reading "+sb.length());
} catch (IOException e) {
e.printStackTrace();
}
finally{
pw.flush();
try{
isr.close();
}catch(Exception e){}
}
Trong những trường hợp đó không làm việc nó in Finished reading 521
. Nhưng tôi cố gắng lấy kết quả qua số pw
và không phải là sb
.
pw
là PrintWriter pw = PrintWriter (OutputStream); `mà tôi vượt qua trong Runnable
Cập nhật 2:
Dường như: status = process.waitFor();
lợi nhuận trước trước các Runnable rằng xử lý kết thúc inputstream. Làm thế nào điều này có thể xảy ra?
Tôi đọc trong javadoc:
the calling thread will be blocked until the subprocess exits
. Vậy điều đó có nghĩa là tôi có thể trả về trước khi tiêu thụ luồng I/O không?
Cập nhật 3:
Có vẻ là cùng một vấn đề ở đây trong Ruby
Tức là có một số điều kiện chủng tộc giữa quá trình kết thúc và tiêu thụ đầu ra
Nếu quá trình gọi một quy trình khác, quy trình đầu tiên có thể trả về hành vi sớm - bình thường. – Sebastian
Điều này không phải về việc trở về sớm.Đó là về việc trả lại * trước khi * các luồng đầu ra đã được tiêu thụ – Jim