문제

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 초마다 현재 날짜와 시간을 인쇄합니다 ...하지만 콘솔에 입력을하면 타이머가 주어진 입력 작업을 수행하도록 지연됩니다 ...

나는 비슷한 목적으로 타이머 클래스를 만들었습니다.자유롭게 사용하세요 : 라코 디스

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