문제
Java에서 시간을 재설정 할 수있는 java.utils.Timer를 갖고 싶습니다. X 초 내에 일회성 이벤트가 발생하도록 설정해야합니다.타이머가 생성 된 시간과 X 초 사이에 아무 일도 일어나지 않으면 이벤트가 정상적으로 발생합니다.
그러나 X 초가 경과하기 전에 이벤트가 Y 초 후에 발생하도록 결정한 경우 이벤트가 Y 초 내에 발생하도록 타이머에 시간을 재설정하도록 지시 할 수 있기를 원합니다. 예 :타이머는 다음과 같은 작업을 수행 할 수 있어야합니다. 라코 디스
유틸리티 타이머를 사용하여이 작업을 수행하는 방법을 찾을 수 없습니다. cancel ()을 호출하면 다시 예약 할 수 없습니다.
이 동작을 복제하는 유일한 방법은 javax.swing.Timer를 사용하고 원래 타이머를 중지하고 새 타이머를 만드는 것입니다.예 : 라코 디스
더 쉬운 방법이 있습니까?
해결책
Timer
설명서에 따르면, Java 1.5 이상에서는 ScheduledThreadPoolExecutor
대신. ( Executors
<를 사용하여이 실행기를 만들 수 있습니다. / a> .newSingleThreadScheduledExecutor()
는 사용하기 쉽기 때문에 Timer
와 매우 유사합니다.)
멋진 점은 작업을 예약 할 때 (schedule()
를 호출하여) ScheduledFuture
객체. 이를 사용하여 예약 된 작업을 취소 할 수 있습니다. 그런 다음 트리거 시간이 다른 새 작업을 자유롭게 제출할 수 있습니다.
ETA :에 링크 된 Timer
문서에는 ScheduledThreadPoolExecutor
에 대한 내용이 없지만 OpenJDK 버전에는이 기능이 있습니다. 말하기 :
<인용구>
Java 5.0은 java.util.concurrent
패키지를 도입했으며
그 안에있는 동시성 유틸리티 중 하나는
반복적으로 쓰레드 풀인 ScheduledThreadPoolExecutor
주어진 속도 또는 지연으로 작업을 실행합니다. 효과적으로 더
Timer
/ TimerTask
의 다양한 대체품
조합은 여러 서비스 스레드를 허용하므로 다양한
시간 단위이며 하위 분류 유전자 태그 코드가 필요하지 않습니다.
TimerTask
구현). 구성
스레드가 하나 인 Runnable
는 다음과 같습니다.
ScheduledThreadPoolExecutor
.
다른 팁
당신의 Timer
가 실행할 작업이 하나뿐이라면 하위 클래스를 만드는 것이 좋습니다.
라코 디스
오용에 대한 검사를 추가하려면 코드 작업이 필요하지만 원하는 것을 달성해야합니다.ScheduledThreadPoolExecutor
는 기존 작업의 일정 변경을 지원하지 않는 것 같지만 유사한 접근 방식이 거기에서도 작동합니다.
전체 코드 스 니펫은 다음과 같습니다. .... 도움이 되길 바랍니다. 라코 디스
반복 작업을 예약해야합니까?이 경우 쿼츠 를 사용하는 것이 좋습니다.
Timer/TimerTask
로는 불가능하다고 생각합니다.하지만 정확히 무엇을 달성하고 싶은지에 따라 java.util.concurrent.ScheduledThreadPoolExecutor
를 사용하는 것이 만족 스러울 수 있습니다.
이것이 제가 시도하고있는 것입니다. TimerTask를 사용하여 60 초마다 데이터베이스를 폴링하는 클래스가 있습니다.
메인 클래스에서는 Timer의 인스턴스와 TimerTask의 로컬 하위 클래스의 인스턴스를 유지합니다. 메인 클래스에는 폴링 간격을 설정하는 방법이 있습니다 (예 : 60에서 30으로 이동). 그 안에 TimerTask (내 하위 클래스이며 cancel () 메서드를 덮어 써 정리를 수행하지만 중요하지 않음)를 취소 한 다음 null로 만듭니다. 새 인스턴스를 다시 만들고 기존 타이머의 새 간격으로 새 인스턴스를 예약합니다.
Timer 자체가 취소되지 않았기 때문에 사용하던 스레드는 활성 상태를 유지하고 (그리고 그 안에있는 다른 TimerTask도 마찬가지 임) 이전 TimerTask는 동일한 새 것으로 대체되지만 VIRGIN (이전 것이 실행되거나 예약되었으므로 예약에 필요한만큼 더 이상 VIRGIN이 아닙니다.)
전체 타이머를 종료하고 싶을 때 TimerTask를 취소하고 null로 설정 한 다음 (TimerTask의 하위 클래스에서 리소스를 정리하기 위해 타이밍을 변경할 때와 동일), Timer 자체를 취소하고 null .
다음은 재설정 가능 타이머의 예입니다.편의를 위해 변경해보세요 ... 라코 디스
이 예제는 5 초마다 현재 날짜와 시간을 인쇄합니다 ...하지만 콘솔에 입력을하면 타이머가 주어진 입력 작업을 수행하도록 지연됩니다 ...
나는 비슷한 목적으로 타이머 클래스를 만들었습니다.자유롭게 사용하세요 : 라코 디스