2009-09-21 3 views
95

비슷한 질문이 여기에 있지만 만족스럽지 않습니다. 그래서 다시 질문을 다시 말하자면 -Timer & TimerTask 대 Java의 Thread + sleep

나는 1 분 간격으로 말하면 정기적으로해야 할 일이있다. 수면과 함께 무한 루프가있는 새 스레드를 만드는 것과 반대로 Timertask & Timer를 사용하면 어떤 이점이 있습니까?

코드 timertask-

TimerTask uploadCheckerTimerTask = new TimerTask(){ 

public void run() { 
    NewUploadServer.getInstance().checkAndUploadFiles(); 
} 
}; 

Timer uploadCheckerTimer = new Timer(true); 
uploadCheckerTimer.scheduleAtFixedRate(uploadCheckerTimerTask, 0, 60 * 1000); 

코드 나 특정주기를 놓치면 로직의 실행이 걸리는 경우 걱정 난 정말이없는

Thread t = new Thread(){ 
public void run() { 
    while(true) { 
    NewUploadServer.getInstance().checkAndUploadFiles(); 
    Thread.sleep(60 * 1000); 
    } 
} 
}; 
t.start(); 

스레드 및 sleep-를 사용하여 스 니펫을 사용하여 니펫을 간격 시간 이상.

이에 대해 언급 해주십시오 ..

감사합니다,
업데이트 -Keshav

:
최근 내가 Thread.sleep를 대 타이머를 사용하여 또 다른 차이점을 발견(). 현재 시스템 시간이 오전 11시라고 가정합니다. 어떤 이유로 시스템 시간을 오전 10 시로 롤백하면 Timer는 오전 11시에 도달 할 때까지 작업 실행을 중지하지만 Thread.sleep() 메서드는 방해받지 않고 작업을 계속 실행합니다. 이것은이 두 가지 사이에서 무엇을 사용할 지 결정할 때 중요한 의사 결정자가 될 수 있습니다.

+21

주문 순서 : Timer 및 TimerTask는 현재 사용되지 않으며 사용자의 포인트가 여전히 있음에도 불구하고 효과적으로 ExecutorService로 대체되었습니다. – skaffman

+0

팁 주셔서 감사합니다. ExecutorService를 사용하기로 결정했습니다. – Keshav

+0

답변 해 주셔서 감사합니다. – Keshav

답변

63

TimerTask의 장점은 사용자의 의도를 훨씬 잘 (즉, 코드 가독성) 표현하고 이미 cancel() 기능을 구현 한 것입니다. 그것은 자신의 예뿐만 아니라 짧은 형태로 기록 될 수

참고 :

Timer uploadCheckerTimer = new Timer(true); 
uploadCheckerTimer.scheduleAtFixedRate(
    new TimerTask() { 
     public void run() { NewUploadServer.getInstance().checkAndUploadFiles(); } 
    }, 0, 60 * 1000); 
가 좀 더 정확 있도록
+0

타이머가 매일, 오후 2시와 오후 9시에 사용되는 경우 ... 값을 제공하는 방법은 무엇입니까? 위의 코드에서 ... @ Zed? – gumuruh

11

타이머/TimerTask를 또한, 계정으로 작업의 실행 시간이 소요 . 그리고 교착 상태를 피하는 것과 같이 멀티 스레딩 문제를 더 잘 처리합니다. 물론 수제 솔루션 대신 잘 테스트 된 표준 코드를 사용하는 것이 좋습니다.

+0

그건 아주 좋은 지적입니다. 고마워요. – Ridcully

3

Java 스레드와 sleep 메소드를 사용하여이 태스크를 관리하는 것에 대한 중요한 인수가 있습니다. while(true)을 사용하여 루프에 무기한 유지하고 절전 모드로 전환하여 스레드를 최대 절전 모드로 전환합니다. NewUploadServer.getInstance().checkAndUploadFiles();이 동기화 된 리소스를 차지하는 경우에는 어떻게됩니까? 다른 스레드는 이러한 리소스에 액세스 할 수 없으며 기아가 발생하여 전체 애플리케이션 속도가 느려질 수 있습니다. 이러한 종류의 오류는 진단하기가 쉽지 않으며 존재를 막는 것이 좋습니다.

다른 aproach가의 run() 메서드를 호출하여 당신에게 중요한 코드, 즉 NewUploadServer.getInstance().checkAndUploadFiles();의 실행을 트리거하여 TimerTask 동안 한편의 리소스를 사용하여 다른 스레드를시키는.

+16

이 인수를 이해할 수 없습니다. 두 선택 모두 스레드에서 동일한 메소드를 실행하며 두 선택 모두 스레드가 실행 대기 중일 때 대기합니다. 두 가지 선택 사이에 기아의 차이는 없습니다. – satur9nine

4

이유는 모르지만 쓰고 있던 프로그램은 타이머를 사용하고 있었고 힙 크기가 스레드/수면 문제로 변경되면 계속 증가하고있었습니다.

+6

타이머는 지속적으로 업데이트되는 작업 큐를 만듭니다. 타이머가 완료되면 즉시 가비지 수집되지 않을 수 있습니다. 더 많은 타이머를 만들면 힙에 더 많은 개체 만 추가됩니다. Thread.sleep()은 스레드를 일시 중지하기 때문에 메모리 오버 헤드가 매우 낮습니다. –

3

스레드가 예외로 인해 죽게되면 문제가됩니다. 그러나 TimerTask가 처리합니다. 이전 실행 실패와 관계없이 실행됩니다.

1

나는 귀하의 문제를 이해하고 있다고 생각하며, 매우 유사한 것을보고 있습니다. 나는 타이머를 되풀이하고있다. 매 30 분마다, 그리고 매 2 일마다. 읽은 내용과 내가 본 주석은 모든 작업이 완료되지 않기 때문에 가비지 수집이 실행되지 않는 것처럼 보입니다. 나는 가비지 콜렉션이 타이머가 잠자기 상태 일 때 실행될 것이라고 생각할 것이다. 그러나 나는 그것을보고 있지 않으며 문서에 따르면 그렇지 않다.

새 스레드를 생성하면 가비지 수집을 완료하고 완료 할 수 있다고 생각합니다.

누군가 나를 잘못 생각하고 상속 한 내용을 다시 작성하면 고통이 될 것입니다.