Java 타이머 대 ExecutorService?
-
03-07-2019 - |
문제
나의 코드가 내 일정을 사용하여 작업 java.util.timer
.내가 찾고 있었다고 보았 ExecutorService
동일한 기능을 수행할 수 있습니다.그래서 이 질문에 여기,당신이 사용되는 타이머 ExecutorService
하는 작업을 예약하고,혜택은 무엇입의 하나를 사용하여 다른?
도 확인하고 싶어 사람이 사용했다 Timer
클래스고 실행이 어떤 문제로는 ExecutorService
해결한다.
해결책
에 따라 Java 동시에서 실습:
Timer
될 수 있는 민감한 변화를 시스템 시계ScheduledThreadPoolExecutor
하지 않습니다.Timer
는 단 하나의 실행 스레드,그래서 오래 실행되는 작업할 수 있는 지연이 다른 작업을 수행할 수 있게 됩니다.ScheduledThreadPoolExecutor
할 수 있습으로 구성된 스레드 수입니다.또한,당신은 완벽하게 제어 만든레,원하는 경우(에 의해 제공하는ThreadFactory
).- 런타임 예외에 던져
TimerTask
죽이는 하나의 스레드,따라서Timer
죽은:-(...즉예약된 작업이 실행되지 않습니다 더 이상입니다.ScheduledThreadExecutor
뿐만 아니라 잡는 런타임 예외가 있지만,그것은 당신이 그들을 처리하려는 경우(재정의하여afterExecute
에서 방법ThreadPoolExecutor
).작업는 예외가 발생한 것입 취소,하지만 다른 작업을 계속 실행됩니다.
를 사용할 수 있는 경우 ScheduledThreadExecutor
대 Timer
, 그렇게 하십시오.
하나 더 많은 것은...동 ScheduledThreadExecutor
에서 사용할 수 없습니다 Java1.4 라이브러리,거기에 백 포트의 JSR166(java.util.concurrent
하)Java1.2,1.3,1.4, 가 ScheduledThreadExecutor
클래스입니다.
다른 팁
당신이 사용할 수 있다면 이유를 생각하기가 어렵습니다. ~ 아니다 Java 5 Executor 프레임 워크를 사용합니다. 부름:
ScheduledExecutorService ex = Executors.newSingleThreadScheduledExecutor();
당신에게 줄 것입니다 ScheduledExecutorService
비슷한 기능이 있습니다 Timer
(즉, 단일 스레드가 될 것입니다) 그러나 액세스는 약간 더 확장 가능할 수 있습니다 (후드 아래에서는 완전한 동기화보다는 동시 구조를 사용합니다. Timer
수업). 사용 a ScheduledExecutorService
또한 다음과 같은 장점을 제공합니다.
- 필요한 경우 사용자 정의 할 수 있습니다 (참조
newScheduledThreadPoolExecutor()
아니면 그ScheduledThreadPoolExecutor
수업) - 'One Off'실행은 결과를 반환 할 수 있습니다
고집해야 할 유일한 이유에 대해 Timer
나는 생각할 수있다 :
- Pre Java 5를 사용할 수 있습니다
- J2ME에서 비슷한 클래스가 제공되므로 응용 프로그램을 쉽게 포팅 할 수 있습니다 (그러나이 경우 공통 추상화 계층을 추가하는 것은별로 어렵지 않습니다).
ExecutorService는 더 새롭고 일반입니다. 타이머는 정기적으로 예약 한 내용을 실행하는 스레드 일뿐입니다.
ExecutorService는 스레드 풀이거나 클러스터의 다른 시스템에 퍼져 일회성 배치 실행 등을 수행 할 수도 있습니다.
각 제안이 무엇을 결정 해야하는지 살펴보십시오.
타이머 사용과 관련하여 더 좋은 관행은 다음과 같습니다.
http://tech.puredanger.com/2008/09/22/timer-rules/
일반적으로, 나는 빠르고 더러운 물건을 위해 타이머를 사용하고보다 강력한 사용을 위해 집행자를 사용했습니다.
Executors.newsingLethreadScheduledExecutor ()보다 타이머를 선호하는 이유는 데몬 스레드에서 타이머가 필요할 때 더 깨끗한 코드를 얻기 때문입니다.
비교하다
private final ThreadFactory threadFactory = new ThreadFactory() {
public Thread newThread(Runnable r) {
Thread t = new Thread(r);
t.setDaemon(true);
return t;
}
};
private final ScheduledExecutorService timer = Executors.newSingleThreadScheduledExecutor(threadFactory);
~와 함께
private final Timer timer = new Timer(true);
ExecutorService의 견고성이 필요하지 않을 때는이 작업을 수행합니다.
Oracle Documentation Page에서 ScheduledThreadPooleExecutor
ㅏ ThreadPooleExecutor 이는 주어진 지연 후 실행되도록 명령을 추가로 예약하거나 주기적으로 실행할 수 있습니다. 이 수업은 바람직합니다 시간제 노동자 여러 작업자 스레드가 필요한 경우 또는 ThreadPooleExecutor (이 클래스 확장)의 추가 유연성 또는 기능이 필요한 경우.
ExecutorService/ThreadPoolExecutor
또는 ScheduledThreadPoolExecutor
여러 작업자 스레드가있을 때 명백한 선택입니다.
장점 ExecutorService
~ 위에 Timer
Timer
사용 가능한 CPU 코어를 활용할 수 없습니다ExecutorService
특히 맛을 사용하는 여러 작업이 있습니다ExecutorService
처럼 포크 조이 풀ExecutorService
여러 작업간에 조정이 필요한 경우 협업 API를 제공합니다. 근로자 작업을 제출하고 모든 작업이 완료되기를 기다려야한다고 가정하십시오. 당신은 쉽게 그것을 달성 할 수 있습니다 Invokeall API. 여러분과 동일하게 달성하려면Timer
작업은 간단하지 않습니다.ThreadPooleExecutor 스레드 수명주기 관리를위한 더 나은 API를 제공합니다.
스레드 풀은 두 가지 다른 문제를 해결합니다. 태스킹 당 호출 오버 헤드 감소로 인해 많은 수의 비동기 작업을 실행할 때 일반적으로 개선 된 성능을 제공하며 수집을 실행할 때 소비 된 스레드를 포함하여 자원을 경계 및 관리하는 수단을 제공합니다. 작업. 각 ThreadPooleExecutor는 완료된 작업 수와 같은 기본 통계도 유지합니다.
몇 가지 장점 :
ㅏ. 스레드의 수명주기를 생성/관리/제어 할 수 있으며 스레드 생성 비용 오버 헤드를 최적화 할 수 있습니다.
비. 작업 처리 (작업 도둑질, Forkjoinpool, Invokeall) 등을 제어 할 수 있습니다.
씨. 실의 진보와 건강을 모니터링 할 수 있습니다
디. 더 나은 예외 처리 메커니즘을 제공합니다