Я запуска приложения CMD, который выводит в System.out через этот SyncPipe Runnable:конец нити, что застрял в InputStream.read() петли
public class SyncPipe implements Runnable {
private final InputStream is;
private final OutputStream os;
public SyncPipe(InputStream is, OutputStream os) {
this.is = is;
this.os = os;
}
public void run() {
try {
final byte[] buffer = new byte[1024];
for (int length = 0; (length = is.read(buffer)) != -1;)
os.write(buffer, 0, length);
System.out.print("stopped");
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
я начала RunIt с cmd = "C:/bin/read.exe -f D:/test.jpg"
private class RunIt implements Runnable {
public int p;
public String cmd;
public RunIt (int p, String cmd) {
this.p = p;
this.cmd = cmd;
}
public void run() {
ProcessBuilder pb = new ProcessBuilder("cmd");
try {
process = pb.start();
(new Thread(new SyncPipe(process.getErrorStream(), System.err))).start();
(new Thread(new SyncPipe(process.getInputStream(), System.out))).start();
OutputStream out = process.getOutputStream();
out.write((cmd + "\r\n").getBytes());
out.flush();
out.close();
try {
process.waitFor();
} catch (InterruptedException e) {
e.printStackTrace();
}
println("Stopped using %d.", p);
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
Мой вопрос сейчас: Как я могу сделать (new Thread(new SyncPipe(process.getErrorStream(), System.err)))
die? Предоставляя SyncPipe логическую переменную stop
, устанавливая ее true
во время выполнения и проверяя ее с помощью for (int length = 0; (length = is.read(buffer)) != -1 && !stop;)
, не удалось сделать трюк.
Большое спасибо.
Я закончил работу вокруг этого @Gray. Он работает сейчас:
public void run() {
try {
final byte[] buffer = new byte[1024];
do
if (is.available() > 0) {
int length = is.read(buffer);
if (length != -1)
os.write(buffer, 0, length);
else
stop = true;
}
while (!stop);
} catch (Exception ex) {
ex.printStackTrace();
}
}
Вы правы, но он все равно должен закрыть потоки - по крайней мере, потоки фона не заканчивались в Unix без специального закрытия в моей тестовой программе. – Gray
Оба вы правы ... Я убил базовый процесс через 'Runtime.getRuntime(). Exec (" taskkill/f/pid "+ pid);' и моя старая реализация также прекрасно закрывается. Но я определенно должен закрыть потоки. В любом случае: Большое спасибо. – dotwin
@Gray Конечно, ему нужно закрыть потоки, когда он читает EOS на них. Я не сказал иначе. – EJP