Это работает
- Он получен из SingleThreadExecutor, но вы можете легко адаптировать его
- Java 8 код lamdas, но легко исправить
Это создаст Исполнителя с одним потоком, который может получить много задач; и будет ждать, пока текущий завершит выполнение, чтобы начать со следующего
В случае ошибки или исключения uncaughtExceptionHandler его поймает
открытый финальный класс SingleThreadExecutorWithExceptions {
public static ExecutorService newSingleThreadExecutorWithExceptions (final Thread.UncaughtExceptionHandler uncaughtExceptionHandler) {
ThreadFactory factory = (Runnable runnable) -> {
окончательный поток newThread = новый поток (runnable, "SingleThreadExecutorWithExceptions");
newThread.setUncaughtExceptionHandler ((конечный поток, caugthThread, последний Throwable throwable) -> {
uncaughtExceptionHandler.uncaughtException (caugthThread, throwable);
});
вернуть newThread;
};
вернуть новый FinalizableDelegatedExecutorService
(новый ThreadPoolExecutor (1, 1,
0L, TimeUnit.MILLISECONDS,
новый LinkedBlockingQueue (),
завод) {
Защищенная пустота afterExecute (Runnable, Runnable, Throwable throwable) {
super.afterExecute (работоспособный, бросаемый);
if (throwable == null && runnable instanceof Future) {
пытаться {
Будущее будущее = (Будущее) работоспособный;
if (future.isDone ()) {
future.get ();
}
} catch (CancellationException ce) {
бросаемый = ce;
} catch (ExecutionException ee) {
throwable = ee.getCause ();
} catch (InterruptedException ie) {
Thread.currentThread () прерывание (). // игнорируем / сбрасываем
}
}
if (throwable! = null) {
uncaughtExceptionHandler.uncaughtException (Thread.currentThread (), Throwable);
}
}
});
}
закрытый статический класс FinalizableDelegatedExecutorService
extends DelegatedExecutorService {
FinalizableDelegatedExecutorService (ExecutorService executor) {
супер (исполнитель);
}
финал защищенный void () {
super.shutdown ();
}
}
/ **
* Класс-оболочка, который предоставляет только методы ExecutorService
* реализации ExecutorService.
* /
закрытый статический класс DelegatedExecutorService extends AbstractExecutorService {
закрытый финал ExecutorService e;
DelegatedExecutorService (ExecutorService executor) {e = executor; }
public void execute (команда Runnable) {e.execute (команда); }
public void shutdown () {e.shutdown (); }
открытый список shutdownNow () {return e.shutdownNow (); }
public boolean isShutdown () {return e.isShutdown (); }
public boolean isTermination () {return e.isTeridity (); }
public boolean awaitTermination (длительный тайм-аут, блок TimeUnit)
бросает InterruptedException {
return e.awaitTermination (timeout, unit);
}
public Future submit (Выполняемая задача) {
возврат e.submit (задача);
}
публикация в будущем (вызываемая задача) {
возврат e.submit (задача);
}
public Future submit (Выполняемая задача, T результат) {
вернуть e.submit (задача, результат);
}
общедоступный список> invokeAll (коллекция> задачи)
бросает InterruptedException {
return e.invokeAll (задачи);
}
общедоступный список> invokeAll (коллекция> задач,
длительный таймаут, блок TimeUnit)
бросает InterruptedException {
return e.invokeAll (задачи, время ожидания, единица измерения);
}
public T invokeAny (Коллекция> задачи)
выдает InterruptedException, ExecutionException {
return e.invokeAny (задачи);
}
public T invokeAny (Коллекция> задач,
длительный таймаут, блок TimeUnit)
выдает InterruptedException, ExecutionException, TimeoutException {
return e.invokeAny (задачи, время ожидания, единица измерения);
}
}
private SingleThreadExecutorWithExceptions () {}
}