İşlemleri çalıştırmak için ProcessBuilder
kullanıyorum. Girdi/Çıktı akışlarını, bunları bir iş parçacığı havuzunda (Executors.newCachedThreadPool()
) ele alarak ilgili runable'ları göndererek hallediyorum.
Sonuç aldım ama her şimdi ve sonra hiçbir şey alamıyorum.
Örneğin, işlemci üreticisi için cmd \C dir
, dir
sonuçlarını geri alıyorum ama bazen hiçbir şey alamıyorum (buna rağmen sonuç process.getInputStream
'u işleyen runnable'dan geri dönüyor gibi görünüyor).
Bunu nasıl ayıklayabilirim? Müdahale ediyor. Aynı kod ile ben new Thread(runnable).start()
yaptığımda herhangi bir sorun yoktu. Bir iş parçacığı havuzuna geçtikten sonra gerçekleşmeye başladı.Bir işlemin beklenmesi ve akış okunması arasındaki eşzamanlılık sorunu?
Güncelleme:
ben bir şey buldum: Ben Runnable
aşağıdaki do
: Bu Finished reading 521
yazdırır çalışmıyor durumlarda
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){}
}
. Ancak sonucu aracılığıyla ve sb
değil deneyin.
pw
olduğunu PrintWriter pw = PrintWriter (OutputStream); `Ben çalıştırılabilir
Güncelleme 2 geçmek hangi:
O görünüyor: status = process.waitFor();
döner önceki inputStream bitirir ele katedilebilen önce. Bu nasıl olabilir?
javadoc:
the calling thread will be blocked until the subprocess exits
'da okurum. Yani bu, I/O akışlarını tüketmeden önce 'u iade edebildiğim anlamına mı geliyor?
Güncelleme 3:
Ruby
yani burada aynı sorunu gibi görünüyor süreç Gösterge Çıkışı
Bir işlem başka bir işlemi çağırırsa, ilk işlem erken dönebilir - normal davranış. – Sebastian
Bu erken geri dönüş hakkında değil.It çıkışı hakkında * budur * Çıkış akımları tükendi – Jim