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

时间:2015-04-20 09:43:01

标签: java multithreading

我必须检查外部服务是否正常运行或挂起。如果外部进程挂起,我必须将其终止并重新启动它。

问题陈述:
要检查进程是否挂起,我尝试调用它。如果挂起,我不会得到任何回复,我会知道该服务已挂起。

问题是当我尝试调用该进程时,如果它被触发,即使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");
        }
    }
}

2 个答案:

答案 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会更好。