我必须检查外部服务是否正常运行或挂起。如果外部进程挂起,我必须将其终止并重新启动它。
问题陈述:
要检查进程是否挂起,我尝试调用它。如果挂起,我不会得到任何回复,我会知道该服务已挂起。
问题是当我尝试调用该进程时,如果它被触发,即使java线程也会被挂起,所以我想我可以创建一个线程并在该线程中调用该进程。
我将在父线程中有一个计数器,如果子线程在一段时间内没有返回,我会杀死它(调用inturrupt())。
但即便如此,父线程也会挂起。
我有一个Class MyThreadHandler,如下所示:
public class MyThreadHandler {
/**
* @param args
*/
public static void main(String[] args) {
MyThreadHandler myThreadHandler = new MyThreadHandler();
myThreadHandler.handleThread();
}
public void handleThread() {
System.out.println("STARTING LOOPER THREAD");
boolean isRunning = false;
int counter = 0;
MyThreaad myThread = new MyThreaad();
if (!isRunning) {
myThread.start();
System.out.println("aaaaaaaaaaaaaaaa");
isRunning = true;
}
while (true) {
System.out.println("while loop");
counter++;
if (!myThread.isAlive() || counter == 1000) {
System.out.println("HUNG THREAD::: Killing thread");
myThread.interrupt();
break;
}
}
}
}
My Thread类如下:
public class MyThreaad extends Thread{
public void run() {
System.out.println("STARTING LOOPER THREAD");
MyLooper myLooper = new MyLooper();
myLooper.loopIndefinite();
};
}
和MyLooper:
public class MyLooper {
public void loopIndefinite() {
while (true){
System.out.println("a");
}
}
}
答案 0 :(得分:0)
我怀疑问题是两个循环都保持忙碌。在这种情况下,线程调度程序可能会长时间执行一个循环,而另一个(父)似乎挂起
我想,MyLooper
循环无法更改,因为它模拟了挂起的进程。可以执行以下操作以确保父线程获得一些执行时间:
public void handleThread() {
System.out.println("STARTING LOOPER THREAD");
boolean isRunning = false;
int counter = 0;
MyThreaad myThread = new MyThreaad();
myThread.setPriority(Thread.MIN_PRIORITY); // <=== set priority
if (!isRunning) {
myThread.start();
System.out.println("aaaaaaaaaaaaaaaa");
isRunning = true;
}
while (true) {
try {
Thread.sleep(100); // <=== sleep
} catch(InterruptedException e) {
}
System.out.println("while loop");
counter++;
if (!myThread.isAlive() || counter == 1000) {
System.out.println("HUNG THREAD::: Killing thread");
myThread.interrupt();
break;
}
}
}
我添加了2行,一行将“挂起线程”的线程优先级设置为低值,这样即使线程忙,父线程也会获得执行时间。第二行是sleep
,这可以确保父线程不占用所有可用的执行时间。
答案 1 :(得分:0)
如果你没有检查中断状态,那么myThread.interrupt()就没有机会做你想做的事。
你必须在loopIndefinite方法中添加以下内容:
if(Thread.interrupted()) throw new InterruptedException();
你的循环对于CPU非常积极,你不应该像那样强调CPU。按照Fildor的建议,使用ExecutorServices和Future会更好。