To działa
- Wywodzi się z SingleThreadExecutor, ale możesz go łatwo dostosować
- Kod lamdas Java 8, ale łatwy do naprawienia
Stworzy Executora z jednym wątkiem, który może uzyskać wiele zadań; i poczeka, aż bieżące zakończy wykonywanie, a rozpocznie się od następnego
W przypadku nieuczciwego błędu lub wyjątku uncaughtExceptionHandler go złapie
klasa publiczna SingleThreadExecutorWithExceptions {
public static ExecutorService newSingleThreadExecutorWithExceptions (końcowy Thread.UncaughtExceptionHandler uncaughtExceptionHandler) {
ThreadFactory factory = (Runnable runnable) -> {
ostatni wątek newThread = nowy wątek (runnable, „SingleThreadExecutorWithExceptions”);
newThread.setUncaughtExceptionHandler ((końcowy wątek caugthThread, końcowy Throwble wrzut) -> {
uncaughtExceptionHandler.uncaughtException (caugthThread, thrownble);
});
return newThread;
};
zwraca nowy FinalizableDelegatedExecutorService
(nowy ThreadPoolExecutor (1, 1,
0L, TimeUnit.MILLISECONDS,
nowa LinkedBlockingQueue (),
fabryka){
chronione void afterExecute (Runnable runnable, Throwable throwble) {
super.afterExecute (runnable, throwble);
if (throwable == null && runnable instanceof Future) {
próbować {
Future future = (Future) runnable;
if (future.isDone ()) {
future.get ();
}
} catch (CancellationException ce) {
do rzucania = ce;
} catch (ExecutionException ee) {
throwable = ee.getCause ();
} catch (InterruptedException ie) {
Thread.currentThread (). Interrupt (); // zignoruj / zresetuj
}
}
if (do rzucenia! = null) {
uncaughtExceptionHandler.uncaughtException (Thread.currentThread (), do rzucania);
}
}
});
}
prywatna klasa statyczna FinalizableDelegatedExecutorService
rozszerza DelegatedExecutorService {
FinalizableDelegatedExecutorService (ExecutorService executor) {
super (wykonawca);
}
protected void finalize () {
super.shutdown ();
}
}
/ **
* Klasa opakowania, która udostępnia tylko metody ExecutorService
* implementacji ExecutorService.
* /
prywatna klasa statyczna DelegatedExecutorService rozszerza AbstractExecutorService {
prywatny końcowy ExecutorService e;
DelegatedExecutorService (ExecutorService executor) {e = executor; }
public void execute (polecenie Runnable) {e.execute (polecenie); }
public void shutdown () {e.shutdown (); }
public List shutdownNow () {return e.shutdownNow (); }
public boolean isShutdown () {return e.isShutdown (); }
public boolean isTerminated () {return e.isTerminated (); }
public boolean awaitTermination (długi limit czasu, jednostka TimeUnit)
zgłasza InterruptedException {
zwróć e.awaitTermination (limit czasu, jednostka);
}
public Prześlij w przyszłości (zadanie Runnable) {
return e.submit (zadanie);
}
public Prześlij w przyszłości (zadanie na żądanie) {
return e.submit (zadanie);
}
public Prześlij w przyszłości (zadanie Runnable, wynik T) {
return e.submit (zadanie, wynik);
}
lista publiczna> invokeAll (kolekcja> zadania)
zgłasza InterruptedException {
return e.invokeAll (zadania);
}
lista publiczna> invokeAll (kolekcja> zadania,
długi limit czasu, jednostka TimeUnit)
zgłasza InterruptedException {
zwróć e.invokeAll (zadania, limit czasu, jednostka);
}
public T invokeAny (kolekcja> zadania)
zgłasza InterruptedException, ExecutionException {
return e.invokeAny (zadania);
}
public T invokeAny (kolekcja> zadania,
długi limit czasu, jednostka TimeUnit)
zgłasza InterruptedException, ExecutionException, TimeoutException {
return e.invokeAny (zadania, limit czasu, jednostka);
}
}
private SingleThreadExecutorWithExceptions () {}
}