Questo funziona
- È derivato da SingleThreadExecutor, ma è possibile adattarlo facilmente
- Java 8 codice lamdas, ma facile da risolvere
Creerà un Executor con un singolo thread, che può ottenere molte attività; e attenderà che quello corrente termini l'esecuzione con il prossimo
In caso di errore o eccezione di Uncaugth, uncaughtExceptionHandler lo catturerà
classe finale pubblica SingleThreadExecutorWithExceptions {
public static ExecutorService newSingleThreadExecutorWithExceptions (final Thread.UncaughtExceptionHandler uncaughtExceptionHandler) {
ThreadFactory factory = (eseguibile eseguibile) -> {
thread finale newThread = nuovo thread (runnable, "SingleThreadExecutorWithExceptions");
newThread.setUncaughtExceptionHandler ((final Thread caugthThread, Lanciatore finale gettabile) -> {
uncaughtExceptionHandler.uncaughtException (caugthThread, lanciobile);
});
return newThread;
};
restituisce il nuovo FinalizableDelegatedExecutorService
(nuovo ThreadPoolExecutor (1, 1,
0L, TimeUnit.MILLISECONDS,
nuovo LinkedBlockingQueue (),
fabbrica){
protetto vuoto afterExecute (Runnable runnable, Throwable lancable) {
super.afterExecute (eseguibile, gettabile);
if (gettabile == null && istanza eseguibile di Future) {
provare {
Future future = (Future) eseguibile;
if (future.isDone ()) {
future.get ();
}
} catch (CancelException ce) {
gettabile = ce;
} catch (ExecutionException ee) {
throwable = ee.getCause ();
} catch (InterruptedException ie) {
Thread.currentThread () interrupt ().; // ignora / ripristina
}
}
if (gettabile! = null) {
uncaughtExceptionHandler.uncaughtException (Thread.currentThread (), throwable);
}
}
});
}
classe statica privata FinalizableDelegatedExecutorService
estende DelegatedExecutorService {
FinalizableDelegatedExecutorService (esecutore ExecutorService) {
super (esecutore);
}
protetto void finalize () {
super.shutdown ();
}
}
/ **
* Una classe wrapper che espone solo i metodi ExecutorService
* di un'implementazione di ExecutorService.
* /
classe statica privata DelegatedExecutorService estende AbstractExecutorService {
Servizio esecutivo privato finale e;
DelegatedExecutorService (ExecutorServiceecutor) {e = esecutore; }
public void execute (comando eseguibile) {e.execute (comando); }
public void shutdown () {e.shutdown (); }
Elenco pubblico shutdownNow () {return e.shutdownNow (); }
pubblico booleano isShutdown () {return e.isShutdown (); }
pubblico booleano isTerminated () {return e.isTerminated (); }
public boolean awaitTermination (timeout lungo, unità TimeUnit)
genera InterruptedException {
return e.awaitTermination (timeout, unità);
}
public Future submit (attività eseguibile) {
return e.submit (task);
}
public Future submit (attività richiamabile) {
return e.submit (task);
}
public Future submit (attività eseguibile, risultato T) {
return e.submit (task, risultato);
}
Elenco pubblico> invokeAll (Collection> attività)
genera InterruptedException {
return e.invokeAll (attività);
}
Elenco pubblico> invokeAll (Collection> task,
timeout lungo, unità TimeUnit)
genera InterruptedException {
return e.invokeAll (attività, timeout, unità);
}
public T invokeAny (Collection> attività)
genera InterruptedException, ExecutionException {
return e.invokeAny (attività);
}
public T invokeAny (Collection> task,
timeout lungo, unità TimeUnit)
genera InterruptedException, ExecutionException, TimeoutException {
return e.invokeAny (attività, timeout, unità);
}
}
private SingleThreadExecutorWithExceptions () {}
}