Das funktioniert
- Es ist von SingleThreadExecutor abgeleitet, kann jedoch problemlos angepasst werden
- Java 8 Lamdas Code, aber einfach zu beheben
Es wird ein Executor mit einem einzelnen Thread erstellt, der viele Aufgaben ausführen kann. und wartet, bis die aktuelle Ausführung beendet ist, um mit der nächsten zu beginnen
Im Falle eines Uncaugth-Fehlers oder einer Ausnahme der uncaughtExceptionHandler ihn abfangen
öffentliche Abschlussklasse SingleThreadExecutorWithExceptions {
public static ExecutorService newSingleThreadExecutorWithExceptions (endgültiger Thread.UncaughtExceptionHandler uncaughtExceptionHandler) {
ThreadFactory factory = (Runnable runnable) -> {
final Thread newThread = neuer Thread (ausführbar "SingleThreadExecutorWithExceptions");
newThread.setUncaughtExceptionHandler ((letzter Thread caugthThread, letzter Throwable Throwable) -> {
uncaughtExceptionHandler.uncaughtException (caugthThread, throwable);
});
return newThread;
};
Geben Sie den neuen FinalizableDelegatedExecutorService zurück
(neuer ThreadPoolExecutor (1, 1,
0L, TimeUnit.MILLISECONDS,
neue LinkedBlockingQueue (),
Fabrik){
protected void afterExecute (Runnable runnable, Throwable throwable) {
super.afterExecute (lauffähig, wirfbar);
if (throwable == null && ausführbare Instanz von Future) {
Versuchen {
Zukunft Zukunft = (Zukunft) lauffähig;
if (future.isDone ()) {
future.get ();
}}
} catch (CancellationException ce) {
Wurf = ce;
} catch (ExecutionException ee) {
throwable = ee.getCause ();
} catch (InterruptedException dh) {
Thread.currentThread (). Interrupt (); // ignorieren / zurücksetzen
}}
}}
if (throwable! = null) {
uncaughtExceptionHandler.uncaughtException (Thread.currentThread (), throwable);
}}
}}
});
}}
private statische Klasse FinalizableDelegatedExecutorService
erweitert DelegatedExecutorService {
FinalizableDelegatedExecutorService (ExecutorService-Executor) {
super (Testamentsvollstrecker);
}}
protected void finalize () {
super.shutdown ();
}}
}}
/ **
* Eine Wrapper-Klasse, die nur die ExecutorService-Methoden verfügbar macht
* einer ExecutorService-Implementierung.
* /
private statische Klasse DelegatedExecutorService erweitert AbstractExecutorService {
privater endgültiger ExecutorService e;
DelegatedExecutorService (ExecutorService-Executor) {e = Executor; }}
public void execute (ausführbarer Befehl) {e.execute (Befehl); }}
public void shutdown () {e.shutdown (); }}
öffentliche Liste shutdownNow () {return e.shutdownNow (); }}
public boolean isShutdown () {return e.isShutdown (); }}
public boolean isTerminated () {return e.isTerminated (); }}
public boolean awaitTermination (lange Zeitüberschreitung, TimeUnit-Einheit)
löst InterruptedException aus {
return e.awaitTermination (Timeout, Einheit);
}}
public Future submit (ausführbare Aufgabe) {
return e.submit (Aufgabe);
}}
public Future submit (aufrufbare Aufgabe) {
return e.submit (Aufgabe);
}}
public Future submit (ausführbare Aufgabe, T-Ergebnis) {
return e.submit (Aufgabe, Ergebnis);
}}
öffentliche Liste> invokeAll (Sammlung> Aufgaben)
löst InterruptedException aus {
return e.invokeAll (Aufgaben);
}}
öffentliche Liste> invokeAll (Sammlung> Aufgaben,
lange Zeitüberschreitung, TimeUnit-Einheit)
löst InterruptedException aus {
return e.invokeAll (Aufgaben, Zeitüberschreitung, Einheit);
}}
public T invokeAny (Sammlung> Aufgaben)
löst InterruptedException, ExecutionException {aus
return e.invokeAny (Aufgaben);
}}
public T invokeAny (Sammlung> Aufgaben,
lange Zeitüberschreitung, TimeUnit-Einheit)
löst InterruptedException, ExecutionException, TimeoutException aus {
return e.invokeAny (Aufgaben, Zeitüberschreitung, Einheit);
}}
}}
private SingleThreadExecutorWithExceptions () {}
}}