使用 Uncaught Exceptional Handler 在 Exception 上启动一个新线程
Starting a new thread on Exception using Uncaught Exceptional Handler
可运行任务解析传入的 xml 文件并从不同的 class 调用。有时解析可能会失败并抛出异常。即使发生异常,任务也应该是 运行。我尝试使用 Uncaught 异常处理程序在新线程中重新启动相同的任务。但是想要更多的想法。
Class 调用线程:(调用线程)
在新线程中重新启动相同的任务工作正常,但可能处理异常而不导致线程退出应该是这种方式
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();
任务Class:
public void run() {
try {
xmlparser.parse(incomingXmlFile);
}
catch (Exception e) {
Thread.currentThread.getUncaughtExceptionalHandler().uncaughtException(Thread.currentThread(), e);
// this invokes uncaughtException to restart thread ?
}
}
我有一个监视服务(文件目录扫描)运行,所以我一直需要任务,即使线程终止。
当异常发生,调用到uncaughtExceptionHandler时,线程状态为Invalid,重新启动。所以需要新建一个线程重新开始
代码来自 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
但在你的实现中可能有一个公共对象,它可以从一个线程传递到另一个线程并让该对象有一个计数器。
可运行任务解析传入的 xml 文件并从不同的 class 调用。有时解析可能会失败并抛出异常。即使发生异常,任务也应该是 运行。我尝试使用 Uncaught 异常处理程序在新线程中重新启动相同的任务。但是想要更多的想法。
Class 调用线程:(调用线程)
在新线程中重新启动相同的任务工作正常,但可能处理异常而不导致线程退出应该是这种方式
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();
任务Class:
public void run() {
try {
xmlparser.parse(incomingXmlFile);
}
catch (Exception e) {
Thread.currentThread.getUncaughtExceptionalHandler().uncaughtException(Thread.currentThread(), e);
// this invokes uncaughtException to restart thread ?
}
}
我有一个监视服务(文件目录扫描)运行,所以我一直需要任务,即使线程终止。
当异常发生,调用到uncaughtExceptionHandler时,线程状态为Invalid,重新启动。所以需要新建一个线程重新开始
代码来自 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
但在你的实现中可能有一个公共对象,它可以从一个线程传递到另一个线程并让该对象有一个计数器。