我遇到了java线程的问题:
public class MyClass{
public void Core(){
runTools(); //here I would like to call runTools() method
}
public void runTools(){
final String run_tool ="cmd.exe /C sources.exe";
Runnable doRun = new Runnable() {
public void run() {
try {
Process tool_proc = Runtime.getRuntime().exec(run_tool);
}
catch (IOException e) {
e.printStackTrace();
}
}
};
Thread th = new Thread(doRun);
th.start();
}
}
如果我这样做,那么我不知道为什么,但线程不起作用。请给我一些创建线程的想法。我已经看过很多例子,但我应该在这里使用一些代码,例如我的例子。谢谢!
答案 0 :(得分:1)
首先,如果你只想执行一个外部命令并且不打扰它的输出 *,那么使用专用线程是不必要的,因为进程本身已经和你的并行运行了应用程序,因此exec()
调用不会真正挂起您的程序。
然而,你的代码对我来说是正确的。您应该检查应用程序的工作目录(可能cmd.exe
找不到您的sources.exe
)并通过引导tool_proc.getErrorStream()
和{{1的流来评估您启动的流程给您的输出转到tool_proc.getInputStream()
或记录它们。
修改:
* Java documentation表示你总是应该读取进程的System.out
,因为没有这样做可能会导致填满系统缓冲区,这最终会导致进程停止。
答案 1 :(得分:0)
问题1您为Runnable Interface创建了对象,这是永远不可能的。
Runnable * obj = new Runnable(); //这不正确
问题2在另一个方法runTools()
中编写Run()方法的定义我们可以为实现Runnable接口的类创建对象。
由于这些代码无效。
尝试以此方式
public class MyClassName1 implements Runnable
{
public void start()
{
//here you can call your method:runTools()
runTool();
}
}
public void runTools()
{
final String run_tool ="cmd.exe /C sources.exe";
try
{
Process tool_proc = Runtime.getRuntime().exec(run_tool);
}
catch (IOException e)
{
e.printStackTrace();
}
}
这是我的主要课程
public class MyClassName2
{
public static void main(String[] ars)
{
Runnable *obj1=new MyClassName1();
Thread t=new Thread(obj);
t.start()
}
我希望这会对你有所帮助