Ini bekerja
- Ini berasal dari SingleThreadExecutor, tetapi Anda dapat mengadaptasinya dengan mudah
- Kode 8 lamdas Java, tetapi mudah diperbaiki
Ini akan membuat Executor dengan utas tunggal, yang bisa mendapatkan banyak tugas; dan akan menunggu saat ini untuk mengakhiri eksekusi untuk memulai dengan yang berikutnya
Jika terjadi kesalahan atau pengecualian uncaugth, uncaughtExceptionHandler akan menangkapnya
kelas final publik SingleThreadExecutorWithExceptions {
public static ExecutorService newSingleThreadExecutorWithExceptions (Utas terakhir.UncaughtExceptionHandler uncaughtExceptionHandler) {
Pabrik ThreadFactory = (Runnable runnable) -> {
final Thread newThread = new Thread (runnable, "SingleThreadExecutorWithExceptions");
newThread.setUncaughtExceptionHandler ((final Thread caugthThread, final Throwable throwable) -> {
uncaughtExceptionHandler.uncaughtException (caugthThread, throwable);
});
return newThread;
};
kembalikan FinalizableDelegatedExecutorService baru
(ThreadPoolExecutor baru (1, 1,
0L, TimeUnit.MILLISECONDS,
LinkedBlockingQueue () baru,
pabrik){
void afterExecute yang dilindungi (Runnable runnable, Throwable throwable) {
super.afterExecute (runnable, throwable);
if (throwable == null && runnable instance of Future) {
coba {
Future future = (Future) runnable;
if (future.isDone ()) {
future.get ();
}
} catch (PembatalanException ce) {
throwable = ce;
} catch (ExecutionException ee) {
throwable = ee.getCause ();
} catch (mis. InterruptedException) {
Thread.currentThread (). Interrupt (); // abaikan / atur ulang
}
}
if (throwable! = null) {
uncaughtExceptionHandler.uncaughtException (Thread.currentThread (), dapat dibuang);
}
}
});
}
kelas privat statis FinalizableDelegatedExecutorService
memperpanjang DelegatedExecutorService {
FinalizableDelegatedExecutorService (pelaksana ExecutorService) {
super (pelaksana);
}
batal diselesaikan finalisasi () {
super.shutdown ();
}
}
/ **
* Kelas pembungkus yang memaparkan hanya metode ExecutorService
* dari implementasi ExecutorService.
* /
kelas statis pribadi DelegatedExecutorService memperluas AbstractExecutorService {
Layanan ExecutorService final pribadi;
DelegatedExecutorService (ExecutorService executor) {e = pelaksana; }
public void execute (perintah Runnable) {e.execute (perintah); }
public void shutdown () {e.shutdown (); }
Daftar publik shutdownNow () {return e.shutdownNow (); }
public boolean isShutdown () {return e.isShutdown (); }
boolean publik isTerminated () {return e.isTerminated (); }
boolean publik menungguTerminasi (batas waktu yang lama, unit TimeUnit)
melempar InterruptedException {
mengembalikan e.awaitTermination (batas waktu, unit);
}
publik yang akan datang (Tugas yang dapat dijalankan) {
mengembalikan e.submit (tugas);
}
Public Future submit (Tugas yang dapat dipanggil) {
mengembalikan e.submit (tugas);
}
Public Future submit (Tugas yang dapat dijalankan, hasil T) {
mengembalikan e.submit (tugas, hasil);
}
Daftar publik> invokeAll (Koleksi> tugas)
melempar InterruptedException {
return e.invokeAll (tugas);
}
Daftar publik> invokeAll (Koleksi> tugas,
batas waktu lama, unit TimeUnit)
melempar InterruptedException {
mengembalikan e.invokeAll (tugas, batas waktu, unit);
}
publik T invokeAny (Koleksi> tugas)
melempar InterruptedException, ExecutionException {
return e.invokeAny (tugas);
}
publik T invokeAny (Koleksi> tugas,
batas waktu lama, unit TimeUnit)
melempar InterruptedException, ExecutionException, TimeoutException {
return e.invokeAny (tugas, batas waktu, unit);
}
}
private SingleThreadExecutorWithExceptions () {}
}