2016-05-08 40 views
1

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

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

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

编辑

的ExecutorService也运行在自己的线程。这是怎样的线程启动:

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

这是被称为每60分钟线:如果线程(这使得HTTP请求)chrashed

@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()); 
    } 
} 

,整个ExecutorService的不再工作了。如果我发现每一个异常,怎么可能呢?

+0

了'ExecutorService'初始化和你的'Runnable'类的代码片段将是有益的。 –

回答

2

你的情况确实有一个解释,因为ScheduledThreadPoolExecutor

如果任务的任一执行遇到异常,就会取消后续执行。

虽然你正在执行中try{}catch(Exception)块整个任务/工作,有这样的情况,其中Throwable的可能“逃跑”的catch块:

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

}  
+0

谢谢!我希望我能够找出哪些工作不正确。我只需要谷歌如何创建一个* MANIFEST *文件来正确启动我的.jar :)) – beeef

相关问题