监控线程状态
Monitor thread status
所以我在程序启动时启动了这个非常相关的线程。
当主线程做其他事情时,线程正在监听来自更大系统的事件。
线程永远不应停止工作,如果停止工作,则应重新创建并启动它。
我想我知道实现这一目标的多种方法,但我想知道您对某些事情的看法:
- 我是在白白努力吗?我的意思是,如果我理想地尝试捕获所有可能出错的代码,线程会不会无缘无故地背叛我?
- 按照我所说的进行操作的最佳做法是什么?使用另一个线程和 ScheduledExecutor 定期检查线程健康状况?实施某种可观察观察者模式?
您可以通过 Executors.newSingleThreadExecutor()
创建监听事件的 ExecutorService。
在那种情况下,您不必查看线程是否健康,ExecutorService 会处理它。 SingleThreadExecutor 负责一次只有一个任务(Runnable 或 Callable)是 运行。
如果您正在检查使用正常 Java 提供的方法来正确查看线程状态,您应该不会有任何错误。如果抛出检查异常或线程由于某种奇怪的原因退出,try-finally 块应该足以启动一个新线程(同时确保它是非守护进程)。您可以使用带有周期性暂停的 while 循环,最好使用线程调度机制,例如 timed wait(...)
或 timed LockSupport#park(...)
。您也可以休眠线程。
The thread should never stop working and if it does,...
好的,就这么写吧,让它永远不会停止工作。
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();
}
}
}
}
这是一个有点毫无意义和徒劳的练习。应调试应用程序生命周期线程并使其不停止。您的应用程序的主线程在进程生命周期内持续存在,任何其他线程都应按照相同的标准进行设计、测试和调试。
如果停止的线程在崩溃时损坏了其他线程中的数据,会发生什么情况?如果您只是以某种方式重新启动它,数据损坏可能会使情况变得更糟。
所以我在程序启动时启动了这个非常相关的线程。 当主线程做其他事情时,线程正在监听来自更大系统的事件。 线程永远不应停止工作,如果停止工作,则应重新创建并启动它。
我想我知道实现这一目标的多种方法,但我想知道您对某些事情的看法:
- 我是在白白努力吗?我的意思是,如果我理想地尝试捕获所有可能出错的代码,线程会不会无缘无故地背叛我?
- 按照我所说的进行操作的最佳做法是什么?使用另一个线程和 ScheduledExecutor 定期检查线程健康状况?实施某种可观察观察者模式?
您可以通过 Executors.newSingleThreadExecutor()
创建监听事件的 ExecutorService。
在那种情况下,您不必查看线程是否健康,ExecutorService 会处理它。 SingleThreadExecutor 负责一次只有一个任务(Runnable 或 Callable)是 运行。
如果您正在检查使用正常 Java 提供的方法来正确查看线程状态,您应该不会有任何错误。如果抛出检查异常或线程由于某种奇怪的原因退出,try-finally 块应该足以启动一个新线程(同时确保它是非守护进程)。您可以使用带有周期性暂停的 while 循环,最好使用线程调度机制,例如 timed wait(...)
或 timed LockSupport#park(...)
。您也可以休眠线程。
The thread should never stop working and if it does,...
好的,就这么写吧,让它永远不会停止工作。
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();
}
}
}
}
这是一个有点毫无意义和徒劳的练习。应调试应用程序生命周期线程并使其不停止。您的应用程序的主线程在进程生命周期内持续存在,任何其他线程都应按照相同的标准进行设计、测试和调试。
如果停止的线程在崩溃时损坏了其他线程中的数据,会发生什么情况?如果您只是以某种方式重新启动它,数据损坏可能会使情况变得更糟。