자바 타이머 대 ExecutorService?


263

을 사용하여 작업을 예약하는 코드가 java.util.Timer있습니다. 나는 둘러보고 있었고 ExecutorService똑같이 할 수있는 것을 보았다 . 여기이 질문이 있습니다. 당신 은 작업 을 사용 Timer하고 ExecutorService일정을 잡았습니까? 하나를 사용하는 것의 이점은 무엇입니까?

또한 누군가가 Timer수업 을 사용했는지 확인 하고 ExecutorService해결할 수 있는 문제가 발생했는지 확인하고 싶었 습니다.


1
더 많은 기능이 필요한 경우 쿼츠를 확인하십시오 . cron과 같은 cron, 클러스터 인식 스케줄링, 작업에 대한 개별화 된 제어 (한 번에 하나씩 실행, 종속성 등의 개념)를 포함하여 훨씬 더 많은 작업 제어를 제공합니다. --Tim
Tim

답변:


313

실제로 Java Concurrency에 따르면 :

  • Timer시스템 시계의 변화에 ​​민감 할 수 있습니다 ScheduledThreadPoolExecutor.
  • Timer실행 스레드가 하나만 있으므로 장기 실행 작업이 다른 작업을 지연시킬 수 있습니다. ScheduledThreadPoolExecutor임의의 수의 스레드로 구성 할 수 있습니다. 또한 원하는 경우 생성 된 스레드를 완벽하게 제어 할 수 있습니다 (을 제공하여 ThreadFactory).
  • 런타임 예외가 던져 TimerTask하나 개의 스레드가, 따라서 만드는 것을 죽 Timer죽은 :-( ... 즉, 예약 된 작업이 더 이상 실행되지 않습니다. ScheduledThreadExecutor뿐만 아니라 어획량이 예외를 런타임하지만, 당신이 원하는 경우에 당신이 (오버라이드 (override)를 처리 할 수 있습니다 afterExecute에서 방법을 ThreadPoolExecutor). 작업을하는 던진 예외는 취소되지만 다른 작업은 계속 실행됩니다.

ScheduledThreadExecutor대신에 사용할 수 있다면 사용하십시오 Timer.

한가지 더 ... 동안 ScheduledThreadExecutor자바 1.4 라이브러리에서 사용할 수 없습니다하는이 JSR 166 (의 백 포트 java.util.concurrent자바 1.2, 1.3, 1.4) 가, ScheduledThreadExecutor클래스를.


63

사용 가능한 경우 Java 5 executor 프레임 워크를 사용 하지 않는 이유를 생각하기가 어렵습니다 . 부름:

ScheduledExecutorService ex = Executors.newSingleThreadScheduledExecutor();

당신을 줄 것이다 ScheduledExecutorService유사한 기능으로 Timer(즉, 그것이 단일 스레드 될 것입니다)하지만, 그 접근 약간 더 확장 될 수있다 (후드, 그것은에서와 같이 동시 구조가 아니라 완전한 동기화를 사용하는 Timer클래스). 를 사용 ScheduledExecutorService하면 다음과 같은 장점이 있습니다.

  • 필요한 경우 사용자 정의 할 수 있습니다 ( newScheduledThreadPoolExecutor()또는 ScheduledThreadPoolExecutor클래스 참조 )
  • '일회성'실행은 결과를 반환 할 수 있습니다

Timer내가 고집 할 수 있는 유일한 이유 는 다음과 같습니다.

  • 사전 Java 5에서 사용 가능
  • J2ME에는 비슷한 클래스가 제공되어 애플리케이션을 쉽게 이식 할 수 있습니다 (그러나이 경우 공통 추상화 계층을 추가하는 것은 그리 어렵지 않습니다)

1
를 사용하는 또 다른 이유 TimerTask는에 해당하는 scheduledExecutionTime()방법이없는 것 같습니다 ScheduledExecutorService.
Rohit Agarwal

3
또 다른 메모 : 2k17 에이 의견을 쓰고 있습니다 .J2ME는 더 이상 없습니다. 이미 죽었습니다.
msangel

1
Java 타이머 클래스가 엉망입니다.
JohnyTex

26

ExecutorService는 더 새롭고 더 일반적입니다. 타이머는 예약 한 것을 주기적으로 실행하는 스레드입니다.

ExecutorService는 스레드 풀이거나 클러스터의 다른 시스템에 분산되어 일회성 배치 실행 등과 같은 작업을 수행 할 수 있습니다.

각각의 제안을 확인하십시오.



8

ScheduledThreadPoolExecutor의 Oracle 설명서 페이지에서

지정된 지연 후에 실행하거나 주기적으로 실행하도록 명령을 추가로 예약 할 수 있는 ThreadPoolExecutor 이 클래스는 여러 작업자 스레드가 필요한 경우 또는 ThreadPoolExecutor (이 클래스가 확장되는)의 추가 유연성 또는 기능이 필요한 경우 타이머 보다 선호됩니다 .

ExecutorService/ThreadPoolExecutor또는 ScheduledThreadPoolExecutor작업자 스레드가 여러 개인 경우 확실한 선택입니다.

ExecutorService이상의 장점Timer

  1. TimerForkJoinPool 과 같은 ExecutorService풍미를 사용하는 여러 작업 과 달리 사용 가능한 CPU 코어를 활용할 수 없습니다. ExecutorService
  2. ExecutorService여러 작업간에 조정이 필요한 경우 협업 API를 제공합니다. N 개의 작업자 작업을 제출하고 모든 작업이 완료 될 때까지 기다려야한다고 가정합니다. invokeAll API로 쉽게 달성 할 수 있습니다 . 여러 Timer작업으로 동일한 결과를 얻으려면 간단하지 않습니다.
  3. ThreadPoolExecutor 는 스레드 수명주기 관리를위한 더 나은 API를 제공합니다.

    스레드 풀은 두 가지 다른 문제를 해결합니다. 일반적으로 작업 당 호출 오버 헤드 감소로 인해 많은 수의 비동기 작업을 실행할 때 성능이 향상되고 스레드를 포함하여 자원을 바인드하고 관리하는 방법을 제공합니다. 작업. 각 ThreadPoolExecutor는 또한 완료된 작업 수와 같은 몇 가지 기본 통계를 유지합니다

    몇 가지 장점 :

    ㅏ. 스레드 수명주기 생성 / 관리 / 제어 및 스레드 생성 비용 오버 헤드 최적화

    비. 작업 처리 (Work Stealing, ForkJoinPool, invokeAll) 등을 제어 할 수 있습니다.

    씨. 스레드의 진행 상황과 상태를 모니터링 할 수 있습니다

    디. 더 나은 예외 처리 메커니즘 제공


5

때때로 Executors.newSingleThreadScheduledExecutor ()보다 Timer를 선호하는 이유는 데몬 스레드에서 타이머를 실행해야 할 때 훨씬 더 깨끗한 코드를 얻는 것입니다.

비교

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의 견고성이 필요하지 않을 때이 작업을 수행합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.