考虑切换到一个系统,在该系统中,您将作业提交给Executor
从线程中提取内容的线程:
public class MyThread extends Thread {
private final InputStream processStream;
private final Executor executor = Executors.newSingleThreadExecutor();
public MyThread(InputStream processStream) {
this.processStream = processStream;
}
@Override
public void run() {
while ([processStream has stuff]) {
final Object obj = // Get your object from the stream
executor.execute(new Runnable() {
@Override
public void run() {
// Do database stuff with obj
}
});
}
}
private static Object getSomethingFromStream(InputStream stream) {
// return something off the stream
}
}
如果您的 抛出异常Runnable
,它将被记录,但不会停止,它只会继续队列中的下一个作业。另请注意,这是使用单线程执行程序,因此提交的所有内容将一次执行一个,并按照提交的顺序执行。如果您想要并发执行,请使用Executors.newFixedThreadPool(int)
or Executors.newCachedThreadPool()
。请注意,这回答了如何让您的线程保持活力。如果要在作业失败时重新提交可运行以重新执行,请将其run
方法更改为:
@Override
public void run() {
try {
// Do database stuff with obj
} catch (PeristenceException ex) {
// Try again
executor.execute(this);
}
}
您可以为此添加逻辑以定制何时再次尝试异常。