【发布时间】:2009-10-14 12:55:53
【问题描述】:
我正在编写如下所示的 Java 程序,该类只是将命令执行到操作系统级别。然而,有时我们会遇到程序卡住的问题,因此命令永远不会返回任何状态,因此线程不会终止。
现在我正在尝试增强代码,添加一个可以杀死特定线程的附加内容。我已经在捕获 ThreadId 了,这可行吗?
public class ExecuteCmd implements Runnable {
String ProcessId;
String cmd;
BackendSQL bsql;
Logger myLogger;
Thread myThread;
public ExecuteCmd(String cmd, BackendSQL bsql, String ProcessId, Logger myLogger) {
this.ProcessId=ProcessId;
this.cmd=cmd;
this.bsql=bsql;
this.myLogger=myLogger;
}
public void run() {
int rc = 0;
try {
long ThreadId = Thread.currentThread().getId();
bsql.MarkRunning(ProcessId, ThreadId);
myLogger.debug("[ExecuteCmd] Command is: "+cmd);
String[] cmdFull = cmd.split(";");
Runtime rt = Runtime.getRuntime();
Process p = rt.exec(cmdFull);
myLogger.info("[ExecuteCmd] [Threading] "+ ThreadId + ": Executing command");
myLogger.debug("[ExecuteCmd] Command is: "+cmd);
BufferedReader inStream = new BufferedReader(new InputStreamReader(p.getInputStream()));
String inStreamLine = null;
String inStreamLinebyLine=null;
while((inStreamLine = inStream.readLine()) != null) {
inStreamLinebyLine = inStreamLinebyLine+"\n"+inStreamLine;
}
myLogger.info("Command getInputStream: " + inStreamLinebyLine);
try {
rc = p.waitFor();
if (rc == 0) {
bsql.MarkCompleted(ProcessId);
}else{
bsql.MarkFailed(ProcessId);
}
} catch (InterruptedException intexc) {
System.out.println("Interrupted Exception on waitFor: " +
intexc.getMessage());
}
}catch (IOException IOE) {
myLogger.error("IOException[ExecuteCmd]: " + IOE.getMessage());
}catch (Exception e) {
myLogger.error("Exception[ExecuteCmd]: " + e.getMessage());
}
}
}
【问题讨论】:
标签: java multithreading