을 사용하여 작업을 예약하는 코드가 java.util.Timer
있습니다. 나는 둘러보고 있었고 ExecutorService
똑같이 할 수있는 것을 보았다 . 여기이 질문이 있습니다. 당신 은 작업 을 사용 Timer
하고 ExecutorService
일정을 잡았습니까? 하나를 사용하는 것의 이점은 무엇입니까?
또한 누군가가 Timer
수업 을 사용했는지 확인 하고 ExecutorService
해결할 수 있는 문제가 발생했는지 확인하고 싶었 습니다.
답변
실제로 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
클래스를.
답변
사용 가능한 경우 Java 5 executor 프레임 워크를 사용 하지 않는 이유를 생각하기가 어렵습니다 . 부름:
ScheduledExecutorService ex = Executors.newSingleThreadScheduledExecutor();
당신을 줄 것이다 ScheduledExecutorService
유사한 기능으로 Timer
(즉, 그것이 단일 스레드 될 것입니다)하지만, 그 접근 약간 더 확장 될 수있다 (후드, 그것은에서와 같이 동시 구조가 아니라 완전한 동기화를 사용하는 Timer
클래스). 를 사용 ScheduledExecutorService
하면 다음과 같은 장점이 있습니다.
- 필요한 경우 사용자 정의 할 수 있습니다 (
newScheduledThreadPoolExecutor()
또는ScheduledThreadPoolExecutor
클래스 참조 ) - ‘일회성’실행은 결과를 반환 할 수 있습니다
Timer
내가 고집 할 수 있는 유일한 이유 는 다음과 같습니다.
- 사전 Java 5에서 사용 가능
- J2ME에는 비슷한 클래스가 제공되어 애플리케이션을 쉽게 이식 할 수 있습니다 (그러나이 경우 공통 추상화 계층을 추가하는 것은 그리 어렵지 않습니다)
답변
ExecutorService는 더 새롭고 더 일반적입니다. 타이머는 예약 한 것을 주기적으로 실행하는 스레드입니다.
ExecutorService는 스레드 풀이거나 클러스터의 다른 시스템에 분산되어 일회성 배치 실행 등과 같은 작업을 수행 할 수 있습니다.
각각의 제안을 확인하십시오.
답변
타이머 사용에 관한 몇 가지 더 좋은 방법이 있습니다.
http://tech.puredanger.com/2008/09/22/timer-rules/
일반적으로, 나는 타이머를 사용하여 더럽고 더러운 물건을 사용하고 Executor를 사용하여 더 강력한 사용법을 사용합니다.
답변
ScheduledThreadPoolExecutor의 Oracle 설명서 페이지에서
지정된 지연 후에 실행하거나 주기적으로 실행하도록 명령을 추가로 예약 할 수 있는 ThreadPoolExecutor 이 클래스는 여러 작업자 스레드가 필요한 경우 또는 ThreadPoolExecutor (이 클래스가 확장되는)의 추가 유연성 또는 기능이 필요한 경우 타이머 보다 선호됩니다 .
ExecutorService/ThreadPoolExecutor
또는 ScheduledThreadPoolExecutor
작업자 스레드가 여러 개인 경우 확실한 선택입니다.
ExecutorService
이상의 장점Timer
Timer
ForkJoinPool 과 같은ExecutorService
풍미를 사용하는 여러 작업 과 달리 사용 가능한 CPU 코어를 활용할 수 없습니다.ExecutorService
ExecutorService
여러 작업간에 조정이 필요한 경우 협업 API를 제공합니다. N 개의 작업자 작업을 제출하고 모든 작업이 완료 될 때까지 기다려야한다고 가정합니다. invokeAll API로 쉽게 달성 할 수 있습니다 . 여러Timer
작업으로 동일한 결과를 얻으려면 간단하지 않습니다.-
ThreadPoolExecutor 는 스레드 수명주기 관리를위한 더 나은 API를 제공합니다.
스레드 풀은 두 가지 다른 문제를 해결합니다. 일반적으로 작업 당 호출 오버 헤드 감소로 인해 많은 수의 비동기 작업을 실행할 때 성능이 향상되고 스레드를 포함하여 자원을 바인드하고 관리하는 방법을 제공합니다. 작업. 각 ThreadPoolExecutor는 또한 완료된 작업 수와 같은 몇 가지 기본 통계를 유지합니다
몇 가지 장점 :
ㅏ. 스레드 수명주기 생성 / 관리 / 제어 및 스레드 생성 비용 오버 헤드 최적화
비. 작업 처리 (Work Stealing, ForkJoinPool, invokeAll) 등을 제어 할 수 있습니다.
씨. 스레드의 진행 상황과 상태를 모니터링 할 수 있습니다
디. 더 나은 예외 처리 메커니즘 제공
답변
때때로 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의 견고성이 필요하지 않을 때이 작업을 수행합니다.
답변
