Bu çalışıyor
- SingleThreadExecutor'ten türetilmiştir, ancak kolayca adapte edebilirsiniz
- Java 8 lamdas kodu, ancak düzeltilmesi kolay
Çok sayıda görev alabilen tek bir iş parçacıklı bir Executor yaratacaktır; ve geçerli olanın bir sonraki ile başlamasını bekler
Uncaugth hatası veya istisnası durumunda uncaughtExceptionHandler tarafından yakalanır
public final class SingleThreadExecutorWithExceptions {
public static ExecutorService newSingleThreadExecutorWithExceptions (son Thread.UncaughtExceptionHandler uncaughtExceptionHandler) {
ThreadFactory fabrika = (Çalıştırılabilir çalıştırılabilir) -> {
final Thread newThread = new Thread (çalıştırılabilir, "SingleThreadExecutorWithExceptions");
newThread.setUncaughtExceptionHandler ((son Konu caugthThread, son Atılabilir atılabilir) -> {
uncaughtExceptionHandler.uncaughtException (caugthThread, atılabilir);
});
yeni dön; iplik;
};
yeni dönüş yap FinalizableDelegatedExecutorService
(yeni ThreadPoolExecutor (1, 1,
0L, TimeUnit.MILLISECONDS,
yeni LinkedBlockingQueue (),
fabrika){
Execute (çalıştırılabilir çalıştırılabilir, fırlatılabilir atılabilir)
super.afterExecute (çalıştırılabilir, atılabilir);
if (throwable == null && runnable Gelecek örneği) {
Deneyin {
Gelecek gelecek = (Gelecek) koşabilir;
if (future.isDone ()) {
future.get ();
}
} catch (CancellationException ce) {
atılabilir = ce;
} catch (ExecutionException ee) {
throwable = ee.getCause ();
} catch (InterruptedException ie) {
Thread.currentThread () kesme (.); // yoksay / sıfırla
}
}
if (atılabilir! = null) {
uncaughtExceptionHandler.uncaughtException (Thread.currentThread (), throwable);
}
}
});
}
özel statik sınıf FinalizableDelegatedExecutorService
DelegatedExecutorService {
FinalizableDelegatedExecutorService (ExecutorService yöneticisi) {
Süper (infaz);
}
korumalı geçersiz sonlandırma () {
) (Super.shutdown;
}
}
/ **
* Yalnızca ExecutorService yöntemlerini gösteren bir sarmalayıcı sınıfı
* ExecutorService uygulamasının.
* /
özel statik sınıf DelegatedExecutorService, AbstractExecutorService {
özel final İcra Hizmeti e;
DelegatedExecutorService (ExecutorService yürütücüsü) {e = yürütücü; }
public void execute (Çalıştırılabilir komut) {e.execute (komut); }
herkese açık geçersiz kapanma () {e.shutdown (); }
public List shutdownNow () {return e.shutdownNow (); }
public boolean isShutdown () {return e.isShutdown (); }
public boolean isTerminated () {return e.isTerminated (); }
halka açık boolean bekliyor Bekleme (uzun zaman aşımı, TimeUnit birimi)
InterruptedException atar {
return e.awaitTermination (zaman aşımı, birim);
}
public Future send (Çalıştırılabilir görev) {
dönüş e.submit (görev);
}
Herkese açık gelecek sunumu (Çağrılabilir görev) {
dönüş e.submit (görev);
}
public Future send (Çalıştırılabilir görev, T sonucu) {
return e.submit (görev, sonuç);
}
herkese açık Liste> invokeAll (Koleksiyon> görevler)
InterruptedException atar {
return e.invokeAll (görevler);
}
herkese açık Liste> invokeAll (Koleksiyon> görevler,
uzun zaman aşımı, TimeUnit birimi)
InterruptedException atar {
return e.invokeAll (görevler, zaman aşımı, birim);
}
public T invokeAny (Koleksiyon> görevler)
InterruptedException, ExecutionException atar {
return e.invokeAny (görevler);
}
public T invokeAny (Koleksiyon> görevler,
uzun zaman aşımı, TimeUnit birimi)
InterruptedException, ExecutionException, TimeoutException {
return e.invokeAny (görevler, zaman aşımı, birim);
}
}
private SingleThreadExecutorWithExceptions () {}
}