2014-12-03 55 views
1

我使用ExecutorService来执行我的逻辑。如下所示,run方法应该在无限循环中执行。简而言之,run方法是一个消息使用者,它应该从队列中移除消息并处理消息。但是,doSomething()方法遇到一个异常,并且永远不会返回。经过分析,我意识到doSomething()方法中有一个NullPointer。虽然我已经处理了这个异常,但我如何确保循环永远不会终止 - 尽管有任何运行时异常。我无法承担我的Runnable任务无法工作。它会停止整个功能。从ExecutorService中的异常中恢复

ExecutorService service = Executors.newSingleThreadExecutor() 
    service.submit(new Runnable(){ 
     public void run(){ 
      while(true){ 
      doSomething(); 
     } 
    } 
    }) 
+1

好像ExecutorService的滥用。为什么不创建自己的线程? – dnault 2014-12-03 10:47:30

+0

@dnault为什么这是一个滥用?这不是一种更好的做事方式吗? – 2014-12-03 11:14:38

+0

也许“滥用”太过分了。但是ExecutorService在这里没有添加任何值。当你需要运行几个任务时,ExecutorService通常被用作抽象,并且提交任务给服务的代码并不关心它们如何执行的细节。但是在这里你有一个永远循环的单一任务。任何试图向执行者提交其他任务的尝试都将永远阻塞,因为循环任务从未结束。 – dnault 2014-12-03 21:19:39

回答

2

试试你的循环内捕获异常象下面这样:

ExecutorService service = Executors.newSingleThreadExecutor(); 
service.submit(new Runnable(){ 
    public void run(){ 
     while(true){ 
     try { 
      doSomething(); 
     } catch (Exception e) { 
      //log exception etc... 
     } 
    } 
} 
}); 
1

只是围绕运行方法的内容与try/catch捕获每个异常。

ExecutorService service = Executors.newSingleThreadExecutor() 
    service.submit(new Runnable(){ 
     public void run(){ 
      while(true){ 
      try { 
       doSomething(); 
      } catch (Exception e) { 
       handleException(); 
      } 
     } 
    } 
    })