이 작동합니다
- SingleThreadExecutor에서 파생되었지만 쉽게 조정할 수 있습니다.
- Java 8 람다 코드, 수정하기 쉬운
단일 스레드로 Executor를 작성하여 많은 작업을 수행 할 수 있습니다. 현재 실행이 다음 다음으로 시작될 때까지 기다립니다.
주의하지 않은 오류 또는 예외가 발생한 경우 uncaughtExceptionHandler 를 포착합니다.
공개 최종 클래스 SingleThreadExecutorWithExceptions {
공개 정적 ExecutorService newSingleThreadExecutorWithExceptions (최종 Thread.UncaughtExceptionHandler uncaughtExceptionHandler) {
ThreadFactory 팩토리 = (실행 가능한 실행 가능)-> {
final Thread newThread = 새 스레드 (실행 가능, "SingleThreadExecutorWithExceptions");
newThread.setUncaughtExceptionHandler ((최종 스레드 caugthThread, 최종 Throwable throwable)-> {
uncaughtExceptionHandler.uncaughtException (caugthThread, throwable);
});
newThread를 반환;
};
새로운 FinalizableDelegatedExecutorService를 반환합니다
(새로운 ThreadPoolExecutor (1, 1,
0L, TimeUnit.MILLISECONDS,
새로운 LinkedBlockingQueue (),
공장){
protected void afterExecute (실행 가능 실행 가능, Throwable Throwable) {
super.afterExecute (실행 가능, 던지기 가능);
if (throwable == null && runnable instance of Future) {
{
미래 미래 = (미래) 실행 가능;
if (future.isDone ()) {
future.get ();
}
} catch (CancellationException ce) {
던질 수있는 = ce;
} catch (ExecutionException ee) {
throwable = ee.getCause ();
} catch (InterruptedException 즉) {
Thread.currentThread (). interrupt (); // 무시 / 리셋
}
}
if (throwable! = null) {
uncaughtExceptionHandler.uncaughtException (Thread.currentThread (), throwable);
}
}
});
}
개인 정적 클래스 FinalizableDelegatedExecutorService
DelegatedExecutorService {
FinalizableDelegatedExecutorService (ExecutorService executor) {
슈퍼 (실행자);
}
protected void finalize () {
super.shutdown ();
}
}
/ **
* ExecutorService 메소드 만 노출하는 랩퍼 클래스
ExecutorService 구현의 *
* /
개인 정적 클래스 DelegatedExecutorService는 AbstractExecutorService를 확장합니다 {
개인 최종 ExecutorService e;
DelegatedExecutorService (ExecutorService executor) {e = 집행자; }
공공 무효 실행 (실행 가능한 명령) {e.execute (명령); }
공공 무효 종료 () {e.shutdown (); }
공개리스트 shutdownNow () {return e.shutdownNow (); }
공개 부울 isShutdown () {return e.isShutdown (); }
공개 부울 isTerminated () {return e.isTerminated (); }
public boolean awaitTermination (긴 타임 아웃, TimeUnit 단위)
InterruptedException {
반환 e.awaitTermination (시간 초과, 단위);
}
공개 미래 제출 (실행 가능한 작업) {
반환 e. 제출 (작업);
}
공개 미래 제출 (통화 가능한 작업) {
반환 e. 제출 (작업);
}
공개 미래 제출 (실행 가능한 작업, T 결과) {
반환 e. 제출 (작업, 결과);
}
공개 목록> invokeAll (Collection> tasks)
InterruptedException {
반환 e.invokeAll (작업);
}
공개 목록> invokeAll (Collection> 작업,
긴 시간 초과, 시간 단위 단위)
InterruptedException {
반환 e.invokeAll (작업, 시간 초과, 단위);
}
공개 T invokeAny (Collection> tasks)
InterruptedException, ExecutionException {
반환 e.invokeAny (작업);
}
공개 T invokeAny (Collection> 작업,
긴 시간 초과, 시간 단위 단위)
InterruptedException, ExecutionException, TimeoutException {을 발생시킵니다.
반환 e.invokeAny (작업, 시간 초과, 단위);
}
}
개인 SingleThreadExecutorWithExceptions () {}
}