gpt4 book ai didi

java - 检查外部服务是否正在运行

转载 作者:搜寻专家 更新时间:2023-11-01 03:50:37 26 4
gpt4 key购买 nike

我必须检查外部服务是否已启动并正在运行或已挂起。如果外部进程挂了,我必须杀死它并重新启动它。

问题陈述:
为了检查进程是否挂起,我尝试调用它。如果它挂了,我不会得到任何响应,我就知道服务挂了。

问题是当我尝试调用进程时,如果它被触发,甚至 java 线程也会挂起,所以我想我可以创建一个线程并在该线程中调用进程。

我将在父线程中有一个计数器,如果子线程在一段时间内没有返回,我将杀死它(调用 inturrupt())。

但即使如此,父线程也会卡在这里。

我有一个 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;
}
}
}
}

我的线程类如下:

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");
}
}
}

最佳答案

我怀疑问题在于两个循环都处于忙碌状态。在这种情况下,线程调度器可能会长时间执行一个循环,而另一个(parent)出现挂起。
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,这确保父线程不会占用所有可用的执行时间。

关于java - 检查外部服务是否正在运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29744341/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com