Java - 线程崩溃后应用程序无法正常工作

标签 java multithreading raspberry-pi

我有一个 Java 应用程序,它使用多个线程,这些线程使用 ScheduledExecutorService 在给定时间后启动。每小时都有一个线程启动、执行一些工作并正确终止。但有时(例如,当 HTTP 请求不起作用时)该线程会崩溃,并且执行器服务不再启动这样的线程。然后我必须退出应用程序(使用 Ctrl-C)并再次重新启动它。

崩溃的线程是否有可能中断 ExecutorService 以实例化新线程? 我不想总是检查应用程序是否仍在运行,因为它正在我的 Raspberry Pi 上运行,并且应该 24/7 运行。

也许你可以帮助我找到解决我的问题的方法!

编辑:

ExecutorService 也在它自己的线程上运行。这就是线程的启动方式:

@Override
public void run() {
    threadFuture = executorService.scheduleAtFixedRate(new IntervalThread(i, p, c, a), 60, 60, TimeUnit.MINUTES);
}

这是每 60 分钟调用一次的线程:

@Override
public void run() {

    try {
        // do some HTTP request here
        // if an error occurs, catch it and log the error message
    } catch (Exception e) {
        LOGGER.error(e.getMessage());
    }
}

如果线程(发出 HTTP 请求)崩溃,整个 ExecutorService 将不再工作。如果我捕获所有异常,这怎么可能?

最佳答案

你的案例确实有一个解释,因为ScheduledThreadPoolExecutor

If any execution of the task encounters an exception, subsequent executions are suppressed.

尽管您正在 try{}catch(Exception) block 中执行整个任务/工作,但在某些情况下,Throwable 可能会“转义”catch block :

  1. 发生了某种错误(例如 OutOfMemoryError)。

  2. 您的日志记录代码 LOGGER.error(e.getMessage()); 在日志记录时引发了异常。

我建议您进行以下修改以了解发生了什么:

@Override
public void run() {
 try {
  try {
    // do some HTTP request here
    // if an error occurs, catch it and log the error message
  } catch (Exception e) {
     LOGGER.error(e.getMessage());
  }
 } catch (Throwable t){
    t.printStackTrace(); // this would require redirect output like java -jar my.jar >> error_log.txt
    // try clean up and exit jvm with System.exit(0);

}    

关于Java - 线程崩溃后应用程序无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37098539/

相关文章:

java - 所有的 servlet 容器都使用 jsessionid 来跟踪 session 吗?

java - ZipFile InputStreams 线程安全吗?

c - 将 wave 加载到数组中 + 减去 channel + 另存为 wave/mp3

linux - Raspberry Pi 终端环境中的 Unicode 和 256 色

具有多个过滤器选项的 Javafx TableView

java - Neo4j 中的 Dijkstra 变体 - 查找所有路径

java - 如何使用 Java 通过 web 服务检索 Sharepoint 文档库中文件的大小

c++ - 多线程和阻塞套接字

python - 如何在 Cython 中为多线程 C++ 类发布 GIL?

linux - 在集群上以 sudo 权限运行 MPI 程序