Isso funciona
- É derivado do SingleThreadExecutor, mas você pode adaptá-lo facilmente
- Código Java 8 lamdas, mas fácil de corrigir
Ele criará um Executor com um único thread, que pode executar muitas tarefas; e aguardará a atual terminar a execução para começar com a próxima
Em caso de erro ou exceção do uncaugth, o uncaughtExceptionHandler o capturará
classe final pública SingleThreadExecutorWithExceptions {
public static ExecutorService newSingleThreadExecutorWithExceptions (final Thread.UncaughtExceptionHandler uncaughtExceptionHandler) {
Fábrica ThreadFactory = (executável executável) -> {
thread final newThread = new Thread (executável, "SingleThreadExecutorWithExceptions");
newThread.setUncaughtExceptionHandler ((thread final caugthThread, final Throwable throwable) -> {
uncaughtExceptionHandler.uncaughtException (caugthThread, throwable);
});
return newThread;
};
retornar novo FinalizableDelegatedExecutorService
(novo ThreadPoolExecutor (1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue (),
fábrica){
nulo protegido afterExecute (executável executável, jogável jogável) {
super.afterExecute (executável, jogável);
if (throwable == null && instance executável de Future) {
experimentar {
Futuro futuro = (Futuro) executável;
if (future.isDone ()) {
future.get ();
}
} catch (CancellationException ce) {
jogável = ce;
} catch (ExecutionException ee) {
throwable = ee.getCause ();
} catch (InterruptedException, por exemplo) {
Thread.currentThread (). Interrupt (); // ignorar / redefinir
}
}
if (lançável! = nulo) {
uncaughtExceptionHandler.uncaughtException (Thread.currentThread (), throwable);
}
}
});
}
classe estática privada FinalizableDelegatedExecutorService
estende DelegatedExecutorService {
FinalizableDelegatedExecutorService (executor ExecutorService) {
super (executor);
}
nulo protegido finalize () {
super.shutdown ();
}
}
/ **
* Uma classe de wrapper que expõe apenas os métodos ExecutorService
* de uma implementação de ExecutorService.
* /
classe estática privada DelegatedExecutorService estende AbstractExecutorService {
final privado ExecutorService e;
DelegatedExecutorService (executorService executor) {e = executor; }
Public void execute (comando executável) {e.execute (comando); }
shutdown vazio público () {e.shutdown (); }
lista pública shutdownNow () {return e.shutdownNow (); }
public boolean isShutdown () {return e.isShutdown (); }
public boolean isTerminated () {return e.isTerminated (); }
público booleano waititTermination (tempo limite longo, unidade TimeUnit)
lança InterruptedException {
return e.awaitTermination (tempo limite, unidade);
}
Envio futuro público (tarefa executável) {
retornar e.submit (tarefa);
}
Envio futuro público (tarefa que pode ser chamada) {
retornar e.submit (tarefa);
}
Envio futuro público (tarefa executável, resultado T) {
retornar e.submit (tarefa, resultado);
}
lista pública> invokeAll (Coleção> tarefas)
lança InterruptedException {
retornar e.invokeAll (tarefas);
}
lista pública> invokeAll (Collection> tarefas,
tempo limite longo, unidade TimeUnit)
lança InterruptedException {
return e.invokeAll (tarefas, tempo limite, unidade);
}
public T invokeAny (Coleção> tarefas)
lança InterruptedException, ExecutionException {
retornar e.invokeAny (tarefas);
}
public T invokeAny (Coleção> tarefas,
tempo limite longo, unidade TimeUnit)
lança InterruptedException, ExecutionException, TimeoutException {
return e.invokeAny (tarefas, tempo limite, unidade);
}
}
private SingleThreadExecutorWithExceptions () {}
}