programing

Java 타이머와 Executor Service의 비교

newsource 2022. 8. 1. 22:51

Java 타이머와 Executor Service의 비교

다음을 사용하여 작업을 스케줄링하는 코드가 있다.java.util.Timer주위를 둘러보는데ExecutorService같은 일을 할 수 있다.그래서 여기 이 질문이 있는데, 이 질문에서Timer그리고.ExecutorService작업 스케줄을 설정하기 위해 사용하는 것의 이점은 무엇입니까?

또, 이 제품을 사용한 사람이 있는지 확인해 보고 싶었습니다.Timer수업과 관련된 모든 문제에 부딪혔다.ExecutorService해결했습니다.

Java Curcurency in Practice에 따르면:

  • Timer는 시스템 클럭의 변화에 민감할 수 있습니다.ScheduledThreadPoolExecutor그렇지 않아요.
  • Timer에는 실행 스레드가1개밖에 없기 때문에 장시간 실행되는 작업으로 인해 다른 작업이 지연될 수 있습니다. ScheduledThreadPoolExecutor는 임의의 수의 스레드로 구성할 수 있습니다.게다가 필요에 따라서, 작성된 스레드를 완전하게 제어할 수 있습니다.ThreadFactory).
  • 실행 시 예외 발생TimerTask그 한 가닥을 죽여서, 그렇게 만드는 거야.Timerdead :-(예: 스케줄링된 작업은 더 이상 실행되지 않습니다. ScheduledThreadExecutor런타임 예외를 검출할 뿐만 아니라 필요에 따라 처리할 수 있습니다(오버라이드).afterExecute로부터의 방법.ThreadPoolExecutor예외를 발생시킨 작업은 취소되지만 다른 작업은 계속 실행됩니다.

사용할 수 있다면ScheduledThreadExecutor대신Timer, 그렇게 합니다.

한 가지 더...하는 동안에ScheduledThreadExecutorJava 1.4 라이브러리에서는 사용할 수 없습니다.JSR 166 java.util.concurrent()의 Java 1.2, 1.3, 1.4에 대한 백포트가 있습니다.ScheduledThreadExecutor학급.

이용 가능한 경우 Java 5 실행자 프레임워크를 사용하지 않는 이유를 생각하기 어렵습니다.호출:

ScheduledExecutorService ex = Executors.newSingleThreadScheduledExecutor();

너에게 줄 것이다ScheduledExecutorService와 같은 기능을 가진Timer(즉, 싱글 소켓이 됩니다) 그러나 그 접근은 약간 더 확장성이 있을 수 있습니다(후드 아래에서, 이것은 완전한 동기화보다는 동시 구조를 사용합니다).Timer클래스)사용방법ScheduledExecutorService에는 다음과 같은 이점도 있습니다.

  • 필요에 따라서 커스터마이즈 할 수 있습니다( 를 참조).newScheduledThreadPoolExecutor()또는ScheduledThreadPoolExecutor클래스)
  • '일회성' 실행은 결과를 반환할 수 있습니다.

계속해야 하는 유일한 이유에 대해서Timer생각할 수 있는 것은 다음과 같습니다.

  • Java 5 이전부터 이용 가능
  • J2ME에서도 같은 클래스가 제공되어 어플리케이션의 포팅을 용이하게 할 수 있습니다(그러나 이 경우 공통의 추상화 레이어를 추가하는 것은 그다지 어렵지 않습니다).

Executor Service가 더 새롭고 더 일반적입니다.타이머는 사용자가 예약한 작업을 주기적으로 실행하는 스레드입니다.

이그제큐티브 서비스는 스레드 풀일 수도 있고 클러스터 내의 다른 시스템에 분산되어 일회성 배치 실행 등의 작업을 수행할 수도 있습니다.

각자가 무엇을 제안하는지 보세요.

다음은 타이머 사용에 관한 몇 가지 모범 사례입니다.

http://tech.puredanger.com/2008/09/22/timer-rules/

일반적으로 Timer를 사용하여 빠르고 지저분한 작업을 수행하고 Executer를 사용하여 보다 강력한 작업을 수행합니다.

예약의 Oracle 설명서 페이지에서ThreadPoolExecutor

특정 지연 후에 실행되거나 정기적으로 실행되도록 명령을 추가로 스케줄링할 수 있는 ThreadPoolExecutor.이 클래스는 여러 워커 스레드가 필요한 경우 또는 ThreadPoolExecutor(이 클래스가 확장됨)의 유연성 또는 기능이 추가로 필요한 경우 Timer보다 적합합니다.

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

장점ExecutorService에 걸쳐서Timer

  1. Timer사용 가능한 CPU 코어를 이용할 수 없습니다.ExecutorService특히 향미를 사용하는 여러 가지 작업에서ExecutorServiceFork Join Pool처럼
  2. ExecutorService는 여러 작업 간의 조정이 필요한 경우 협업 API를 제공합니다.N개의 작업자 태스크를 제출하고 모든 작업이 완료될 때까지 기다려야 한다고 가정합니다.invokeAll API를 사용하면 쉽게 얻을 수 있습니다.여러 개로 동일한 목표를 달성하려면Timer간단한 일이 아닙니다.
  3. ThreadPoolExecutor는 스레드 라이프 사이클을 관리하기 위한 더 나은 API를 제공합니다.

    스레드 풀은 두 가지 다른 문제에 대처합니다.일반적으로 대량의 비동기 작업을 실행할 때 작업별 호출 오버헤드가 줄어들기 때문에 성능이 향상되고 작업 집합 실행 시 사용되는 스레드 등의 리소스를 제한하고 관리하는 수단이 됩니다.또한 각 ThreadPoolExecutor는 완료된 태스크의 수와 같은 몇 가지 기본 통계 정보를 유지합니다.

    몇 가지 이점:

    a. 스레드의 라이프 사이클을 작성/관리/제어하여 스레드 작성 비용 오버헤드를 최적화할 수 있습니다.

    b. 작업(Work Stealing, Fork Join Pool, invoke All) 등의 처리를 제어할 수 있습니다.

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

    d. 더 나은 예외 처리 메커니즘을 제공합니다.

가끔 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);

실행 서비스의 견고성이 필요하지 않을 때 이 작업을 수행합니다.

타이머에 문제가 있어서 수정하기 위해 Scheduled Executor Service로 교체했습니다.

문제는 타이머가 시스템 시간에 따라 달라지며 변경할 때마다 응용 프로그램의 기능에 영향을 준다는 것입니다.Timer를 Scheduled Executor Service로 교체하여 정상적으로 동작하고 있습니다.

언급URL : https://stackoverflow.com/questions/409932/java-timer-vs-executorservice