所以,我有一个需要在守护程序线程中观察的进程,但是当它们首先执行Thread.sleep()时它会停止。例如:
ProcessBuilder pb = new ProcessBuilder(argsList);
pb.directory(new File("path"));
Process process = pb.start();
new ProcessListenerDaemon(clientName, username, process).start();
因此,ProcessListenerDaemon在run()
中有延迟@Override
public void run(){
try{;
while(isProcessAlive()){
Thread.sleep(SLEEP_TIME * 1000);
doSomethisng();
}
System.exit(0);
} catch (InterruptedException e){
e.printStackTrace();
}
}
延迟太长(例如20秒)它不会唤醒,如果它太短(1秒)它会正常工作但Process会挂起(可能它会调用Thread.sleep() ) 有什么问题?
答案 0 :(得分:1)
仅使用您提供的信息来诊断问题非常困难,但是,我可以说我的第一条关于多线程的规则是:永远不要使用时间来同步线程。你永远不会知道在创建第二个线程或者线程是否已经完成时是否会执行start()之后的句子。当我需要运行两个线程,并且想要在执行主线程中的下一个句子之后确保新线程可用时,我使用类似于此的代码:
final Object lock = new Object();
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
synchronized(lock) {
lock.notify();
}
...
}});
t2.start();
synchronized (lock) {
try {
lock.wait();
} catch (InterruptedException e) {
// Thread was interrupted before it started
...
}
}
... your t2 thread is running
第二:永远不要使用System.exit()方法,它会杀死你的程序。