문제

나의 코드가 내 일정을 사용하여 작업 java.util.timer.내가 찾고 있었다고 보았 ExecutorService 동일한 기능을 수행할 수 있습니다.그래서 이 질문에 여기,당신이 사용되는 타이머 ExecutorService 하는 작업을 예약하고,혜택은 무엇입의 하나를 사용하여 다른?

도 확인하고 싶어 사람이 사용했다 Timer 클래스고 실행이 어떤 문제로는 ExecutorService 해결한다.

도움이 되었습니까?

해결책

에 따라 Java 동시에서 실습:

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

를 사용할 수 있는 경우 ScheduledThreadExecutorTimer, 그렇게 하십시오.

하나 더 많은 것은...동 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

  1. Timer 사용 가능한 CPU 코어를 활용할 수 없습니다 ExecutorService 특히 맛을 사용하는 여러 작업이 있습니다 ExecutorService 처럼 포크 조이 풀
  2. ExecutorService 여러 작업간에 조정이 필요한 경우 협업 API를 제공합니다. 근로자 작업을 제출하고 모든 작업이 완료되기를 기다려야한다고 가정하십시오. 당신은 쉽게 그것을 달성 할 수 있습니다 Invokeall API. 여러분과 동일하게 달성하려면 Timer 작업은 간단하지 않습니다.
  3. ThreadPooleExecutor 스레드 수명주기 관리를위한 더 나은 API를 제공합니다.

    스레드 풀은 두 가지 다른 문제를 해결합니다. 태스킹 당 호출 오버 헤드 감소로 인해 많은 수의 비동기 작업을 실행할 때 일반적으로 개선 된 성능을 제공하며 수집을 실행할 때 소비 된 스레드를 포함하여 자원을 경계 및 관리하는 수단을 제공합니다. 작업. 각 ThreadPooleExecutor는 완료된 작업 수와 같은 기본 통계도 유지합니다.

    몇 가지 장점 :

    ㅏ. 스레드의 수명주기를 생성/관리/제어 할 수 있으며 스레드 생성 비용 오버 헤드를 최적화 할 수 있습니다.

    비. 작업 처리 (작업 도둑질, Forkjoinpool, Invokeall) 등을 제어 할 수 있습니다.

    씨. 실의 진보와 건강을 모니터링 할 수 있습니다

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top