监视线程状态

时间:2015-06-03 14:46:14

标签: java multithreading executorservice

所以我有一个非常相关的线程,我在程序启动时启动。 线程正在侦听来自更大系统的事件,因为主线程执行其他操作。 线程应该永远不会停止工作,如果确实如此,它应该重新创建并启动。

我想我知道有多种方法可以做到这一点,但我想知道你对某些事情的看法:

  • 我只是在争取什么?我的意思是,如果我理想地尝试捕获所有可能出错的代码,那么线程会不会出于明显的原因而背叛我?
  • 做我所说的最佳做法是什么?使用另一个线程和ScheduledExecutor定期检查线程运行状况?实现某种可观察观察者模式?

4 个答案:

答案 0 :(得分:1)

您可以创建通过Executors.newSingleThreadExecutor()收听事件的ExecutorService。 在这种情况下,如果线程健康,则不必查看该线程,ExecutorService负责处理。 SingleThreadExecutor负责一次只运行一个Task(Runnable或Callable)。

答案 1 :(得分:1)

如果使用普通的Java提供的方法检查正确查看线程状态,则不应该有任何错误。如果抛出一个已检查的异常或由于一些奇怪的原因而退出该线程,则try-finally块应该足以启动一个新线程(同时确保它是非守护进程)。您可以使用带有周期性暂停的while循环,最好使用线程调度机制,例如定时wait(...)或定时LockSupport#park(...)。你也可以睡觉线程。

答案 2 :(得分:1)

  

线程永远不会停止工作,如果确实如此,......

好的,所以写下来以便它永远不会停止工作。

public void run() {
    while (true) {
        try {
            Message message = receiveNextMessage();
            handleMessage(message);
        } catch (Exception ex) {
            LOGGER.error(ex);
            if (somethingTrulyHorribleHasHappened(ex)) {
                Runtime.getRuntime().exit(1);
            } else {
                maybeResetSomethingThatNeedsToBeReset();
            }
        }
    }
}

答案 3 :(得分:1)

这是一种毫无意义和徒劳的做法。应该调试应用程序生命周期线程并使其不停止。您的应用程序的主线程将持续处理生命周期,并且任何其他线程都应按照相同的标准进行设计,测试和调试。

如果停止的线程在崩溃时在其他线程中损坏了数据,会发生什么?如果你只是以某种方式重新启动它,数据损坏可能会使情况变得更糟。