0

可运行任务分析传入的xml文件并从不同的类调用。有时解析可能会失败并抛出异常。即使发生异常,任务仍应运行。我尝试使用未捕获的异常处理程序在新线程中重新启动相同的任务。但想要更多的想法。使用未捕获的异常处理程序在异常上启动新线程

调用Thread类:(调用线程)

它工作正常,重新启动在新线程相同的任务,但可能处理异常不会导致线程退出应该是这样

Thread fileProcessThread = new Thread(FileProcessor); 

    fileProcessorThread.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() 
      { 
      @Override 
      public void uncaughtException (Thread arg0, Throwable arg1) 
       { 
       FileProcessor newObject = new FileProcessorTask(); 
       Thread t = new Thread(newObject); 
       t.start(); 
       } 
      }); 

    fileProcessor.start(); 

任务类:

 public void run() { 

     try { 
       xmlparser.parse(incomingXmlFile); 
      } 
      catch (Exception e) { 
       Thread.currentThread.getUncaughtExceptionalHandler().uncaughtException(Thread.currentThread(), e); 
       // this invokes uncaughtException to restart thread ? 
      } 
     } 

我有一个监视服务(文件目录扫描)运行,所以我需要任务所有th即使线程终止。

+1

在您的情况下再次启动此线程是不合逻辑的。您应该将解析逻辑封装到FileProcessor中,并在catch节中适当地处理xml解析器异常。它与Thread.setUncaughtExceptionHandler无关;如果你可以在这样的线程中放弃对异常的控制,这个可能会很方便。 –

+0

我有一个观察服务(文件目录扫描)在线程上运行,所以我希望这个线程继续,尽管发生了一个异常@AlexanderDrobyshevsky –

+1

一旦涉及到由getUncaughtExceptionalHandler设置的ExceptionHandle,你的线程将被销毁结束。您只能启动一次线程。因此,您可以在正在运行的方法内正确处理异常,或者在此方法死亡时启动新线程。在最后一种情况下,您应该创建一个新线程。 –

回答

1

当发生异常并且调用到达uncaughtExceptionHandler时,线程的状态为无效,以便再次启动。所以你需要创建一个新的线程并重新开始。

Thread.start(代码)

// A zero status value corresponds to state "NEW". 
if (threadStatus != 0) 
    throw new IllegalThreadStateException(); 

然而,这很容易导致无限循环。 (例外 - >赶 - >重试 - >例外 - >赶上...) 我建议有一个计数器,在某个点后停止重试。

Public class TestClass{ 
    static AtomicInteger counter = new AtomicInteger(); 

    static class MyExceptionHandler implements UncaughtExceptionHandler { 
     @Override 
     public void uncaughtException(Thread t, Throwable e) { 
      System.out.println("caught"); 
      if (counter.get() == 3) { 
       System.out.println("Reached Max. retries, exiting"); 
      } else { 
       counter.incrementAndGet(); 
       new Thread(new MyTask()).start(); 
      } 

     } 
    } 

    static class MyTask implements Runnable { 
     @Override 
     public void run() { 
      try { 
       Thread.currentThread().setUncaughtExceptionHandler(new MyExceptionHandler()); 
       System.out.println("slept"); 
       Thread.sleep(500); 
       double d = 0/0; 
      } catch (InterruptedException e) {} 
     } 
    } 

    public static void main(String args[]) throws Exception { 
     Thread thread = new Thread(new MyTask()); 
     thread.start(); 
    } 
} 

我用static AtomicInteger但在您的实现可能有它可以从一个线程传递到另一个,并让该对象有一个柜台一个共同的目标。

相关问题