2017-04-20 75 views
3

在我的Java应用程序,我有一个日志备份的功能:Java进程WAITFOR()函数会导致应用程序冻结

rt = Runtime.getRuntime(); 
pr = rt.exec(command); 
int exitVal = pr.waitFor(); 

if(exitVal == 0) 
    return true 

问题是,它需要一段时间来备份日志,并得到回应,直到然后我的应用程序冻结。如果我删除了pr.waitFor()函数调用,我得到一个响应,但日志备份无法工作。

+0

要么你需要等待它,要么你不需要。根据你的确切上下文,你可以使用某种后台线程来执行进程,并有某种观察者,当进程完成时会收到通知。来自Swing API的'SwingWorker'做了这个(或多或少) – MadProgrammer

+0

根据这个试验,它的工作原理。 http://stackoverflow.com/questions/3489543/how-to-call-a-method-with-a-separate-thread-in-java/3489549 –

回答

1

是的,你应该在一个单独的线程中完成这项工作。阅读有关Runnable接口和线程类

+0

谢谢!使用线程来解决问题 –

2

waitFor()方法会导致当前线程等待(如有必要),直到此Process对象表示的进程已终止。如果子进程已经终止,则此方法立即返回。如果子进程尚未终止,则调用线程将被阻塞,直到子进程退出。

因此你可以创建另一个执行命令的线程。 pr = rt.exec(command); 。您可能需要异步执行此任务。因为直到子进程终止进程将等待。

+0

感谢它的工作原理! –