개발 중에는 종종 몇 분마다 특정 작업을 수행하는 것과 같은 정기적 인 작업이 필요합니다. 현재 타이머를 설정해야합니다. Java에서이를 구현하는 가장 편리하고 효율적인 방법은 java.util.timer 도구 클래스를 사용한 다음 java.util.timertask 작업을 예약하는 것입니다.
타이머는 나중에 백그라운드 스레드에서 실행되는 작업을 정렬하는 데 사용하는 도구입니다. 작업을 한 번 실행하거나 반복적으로 실행할 수 있습니다. 실제로 시간 정기 일정에 의해 소유 한 타임 스케일을 예약하는 스레드입니다.
Timertask는 서브 클래스가 타이머에 의해 실행되거나 반복되는 작업으로 배열되는 추상 클래스입니다. 실제로, 그것은 실행 메소드가있는 클래스이며, 정기적으로 실행 해야하는 코드는 실행 방법 본문에 배치됩니다.
Java는 JDK1.3에서 타이머 클래스 타이머를 출시 한 다음 Doulea는 JDK1.5 이후 다중 스레딩을 지원하는 ScheduleThreadPooleExecutor를 새로 개발했습니다. 후자의 성능으로 판단하면 타이머를 완전히 대체하는 것을 고려할 수 있습니다.
타이머와 schedulethreadpoolexecutor의 비교 :
1. 타이머는 JDK1.3으로 시작합니다. 원리는이 큐에 모든 타이밍 작업을 추가하기 위해 Timertask 어레이를 큐로 사용하는 것입니다. 그런 다음 스레드를 시작하십시오. 대기열이 비어 있으면 스레드가 차단됩니다. 대기열에 데이터가 있으면 스레드가 판단 할 타이머스크를 제거합니다.
시간이 최신 상태이든, 실행 시간이 현재 시간보다 작거나 같으면 작업이 실행되기 시작합니다. 단일 스레드 특성으로 인해 몇 가지 문제가 발생합니다 (자세한 코드는 나중에).
첫째, 타이머에 추가하는 작업이 시간이 소요될 때이 타이머는 단일 스레드 순차 방식으로 타이머 작업을 실행하므로 후속 작업의 적시 실행에 영향을 미칩니다.
자바 코드
// 문제의 예 : M_TIMER.SCHEDULEATFIXEDRATE (New TaskUselongTime (), 1000, 5000); M_TIMER.SCHEDULEATFIXEDRATE (New TaskNormal (), 5000, 3000); 실행 결과 : 14:44:29 : 타이머는 10 초 동안 잠을 자고 있습니다 14:44:39 : 타이머는 잠자면 14:44:39 : 타이머가 10 초 동안 잠자는 일 14:44:49 : 작업 정규 실행 14:44:49 : 작업 일반 실행 14:44:49 : 작업 정상 실행 14:44:49 : 작업 정상 실행 14:49:49 : 작업 정상 실행 14:49 : 14:44:49 : 작업 일반 실행 14:44:49 : 타이머가 수면 10 초 결과 분석 : 3 초마다 한 번씩 실행할 수 없으므로 작업이 완료된 후에 만 실행할 때까지 대기 할 수 있습니다.
둘째, 타이머의 스레드는 InterruptedException 예외 만 포착하므로 사용자 정의 타이밍 작업이 가능한 예외를 포착하지 못하고 예외가 발생하는 경우,
// 예제 2 : M_TIMER.SCEDULE (New TaskThrowException (), 1000); m_timer.schedule (new tasknormal (), 2000); 실행 결과 : 14:47:37 : Timer_Test.TimerS $ taskThrowException.Run (TimerTest.java:85)에서 TimerThread.MainLoop (Timer.java:512)에서 Timer_test.timertest $ taskThrowException.Run (TimerTest.java:85)에서 스레드 "Timer-0"java.lang.runtimeexception에서 예외 예외 예외를 던집니다. java.util.timerthread.run (timer.java:462) 결과 분석 : 작업에 의해 예외가 발생한 후에는 후속 작업이 정상적인 작업을 계속 실행할 수 없습니다.
이로 인해 타이머 스레드가 중지되어 다른 후속 작업을 실행할 수 없습니다.
셋째, 동시에 발생하는 여러 타이밍 작업을 처리 할 수 없습니다.
// 세 가지 질문 분석 : M_TIMER.SCHEDUEATFIXEDRATE (New TaskUselongTime ( "Timer1"), 1000, 15000); M_TIMER.SCHEDULEATFIXEDRATE (New TaskUselongTime ( "Timer2"), 1000, 15000); 실행 결과 : 14:50:16 : Timer1은 10 초 동안 잠을 자고 있습니다.
Code example:
package timer_test; import java.text.simpledateformat; import java.util.date; import java.util.timer; import java.util.timertask; public class timertest {private final timer m_timer = new Timer (); public static void main (string [] argss) {new Timertest ().). 문제의 샘플 : M_TIMER.SCHEDUEATFIXEDRATE (New TaskUselongTime (), 1000, 5000); M_TIMER.SCHEDUEATFIXEDRATE (New TaskNormal (), 5000, 3000); // 예제 2 : // M_TIMER.SCHEDULE (New TaskThrowException (), 1000); // m_timer.schedule (new tasknormal (), 2000); // 예제 3 : // m_timer.scheduleatfixedrate (new taskuselongtime ( "Timer1"), 1000, 5000); // M_TIMER.SCHEDUEATFIXEDRATE (새 taskUselongTime ( "Timer2"), 1000, 5000);} 개인 클래스 TaskUselongTime은 TIMERTASK {private String M_TASKNAME = "TIMER"; public taskUselongTime () {} public taskUelongTime (String taskName) {waskname =}@taskname;} {try {system.out.println (getCurrentTime ()+":"+m_taskName+"는 10 초가 켜져 있습니다"; thread.sleep (10000);} catch (interpruptedException e) {}}} 개인 클래스 작업은 Timertask {@override public void run () {systation.outtln. 실행 된 ");}} 개인 클래스 taskThrowException은 TimertASK를 확장합니다. {@Override public void run () {system.out.println (getCurrentTime ()+": Throw Exception "); strash new runtimeexception ();}} 개인 문자열 getCurrentTime () {return new simpledateformat ("HH : MM : SS ");2.ScheduleThreadPooleExecutor
SchedulEthreadPooleExecutor는 JDK1.5로 시작하여 Doulea 씨가 작성했습니다. Threadpoolexecutor와 Delayqueue의 영리한 조합을 사용하여 다중 스레드 타이머의 구현을 완료하여 타이머의 단일 스레드로 인한 위의 세 가지 결함을 해결합니다.
질문 1의 문제는 단일 스레드가 순차적으로 실행되기 때문에 후속 작업을 제 시간에 완료 할 수 없다는 것입니다. 우리는 멀티 스레딩 이이 문제를 쉽게 해결할 수 있음을 알 수 있습니다. 동시에 TaskUselongTime의 실행 시간이 10s라는 것을 알았습니다 (후속 코드 참조). 작업 간격을 5 초 동안 시간을 보냈지 만 결과에서 작업 실행 간격이 10 초라는 것을 알았으므로 ScheduLETHREDREDPOOLEXECUTOR가 작업 당 테이크 당 모드에서 작동하는 것을 판단 할 수 있습니다.
// 문제 1 : M_TIMER.SCHEDULEATFIXEDRATE (New TaskUselongTime (), 1000, 5000, TimeUnit.milliseconds); M_TIMER.SCHEDUEATFIXEDRATE (New TaskNormal (), 1000, 5000, TimeUnit.milliseconds); 실행 결과 : 14:54:37 : 작업 일반 실행 14:54:37 : 타이머가 10 초 동안 잠자면 14:54:42 : 작업 정상 실행 14:54:47 : 작업 정규 실행 14:54:47 : 작업 정상 실행 14:54:47 : 타이머가 10 초 14:54:52 : 작업 정상 실행
질문 2에서는 예외가 발생하면 작업의 실행이 다른 작업의 작동에 영향을 미치지 않는다는 것을 발견했습니다. 동시에, 우리는 우리의 예외가 실행 결과에서 발생하지 않았다는 것을 알았습니다. SchedulEthreadPooleExecutor 클래스가 시간이 정한 작업을 실행 한 후 ScheduledFuture 실행 결과를 반환하기 때문입니다. 결과가 성공적이든 예외가 있는지 여부는 여기에 저장됩니다.
// 문제 2 : M_TIMER.SCHEDUEATFIXEDRATE (New TaskThrowException (), 1000, 5000, TimeUnit.milliseconds); M_TIMER.SCHEDUEATFIXEDRATE (New TaskNormal (), 1000, 5000, TimeUnit.milliseconds); 실행 결과 : 14:58:36 : 던지기 예외 14:58:36 : 작업 정규 실행 14:58:41 : 작업 정규 실행 14:58:46 : 작업 정규 실행 14:58:46 : 작업 정규 실행 14:58:46 : 작업 일반 실행 14:58:51 : 작업 정상 실행 14:58:56
질문 3 다중 스레드이므로 타이밍 작업을 동시에 실행할 수 있도록 할 수 있습니다.
// 문제 3 : M_TIMER.SCHEDULEATFIXEDRATE (새로운 TaskUselongTime ( "Timer1"), 1000, 5000, TimeUnit.milliseconds); M_TIMER.SCHEDUEATFIXEDRATE (새로운 taskUselongTime ( "Timer2"), 1000, 5000, TimeUnit.milliseconds); 달리기 결과 : 15:01:12 : Timer1은 10 초 15:01:12 : Timer2는 10 초 동안 자고 있습니다. 15:01:22 : Timer2는 10 초 동안 잠을 자고 있습니다 15:01:22 : Timer2는 10 초 동안 자고 있습니다 15:01:22 : Timer2는 10 초 15:01:22 : Timer2는 10 초 5 초 15:01:22 : Timer2는 10 초 15:01:22 : Timer2는 10 초 15 : 01:22 : Timer2 Is Sleeping 10 Seeping 10 Seeping 10 Seeping 10 Seeping 10 Seeping 10 초입니다. 15:01:22 : Timer2는 10 초 동안 잠을 자고 있습니다 15:01:22 : Timer2는 10 초 10 초 15:01:22 : Timer2는 10 초입니다 15:01:22 : Timer2는 10 초 15:01:22 : Timer2는 10 초 15:01 : Seponds 15:012 : Timer는 10 초 15:022 : Timer는 10 초 15:0122입니다. 초 15:01:32 : Timer2는 10 초 동안 자고 있습니다
자세한 코드 :
패키지 timer_test; import java.text.simpledateformat; import java.util.date; import java.util.concurrent.callable; import java.util.concurrent.scheduledthreadpoolecutor; import java.util.concurrent.ctrival final {public wooletecutest {public extrendexexexexexexexecutor; scheduledthreadpoolexecutor m_timer = new scheduledthreadpoolexecutor (10); 공동 정적 무효 메인 (string [] args) {schedulethreadpoolexexecutortest timertest = new schedulethreadpoolexecutortest (); timertest.test (); stride .slee (100000); {timertest.shutdown ();}} public void shutdown () {m_timer.shutdown ();} public void test () {// question 1 : // m_timer.schedueatfixedrate (new taskuselongtime (), 1000, 5000, timeunit.milliseconds); // M_TIMER.SCHEDUEATFIXEDRATE (New TaskNormal (), 1000, 5000, TimeUnit.milliseconds); // 질문 2 : // M_TIMER.SCHEDULEATFIXEDRATE (New TaskThrowException (), 1000, 5000, TimeUnit.milliseconds); // M_TIMER.SCHEDUEATFIXEDRATE (New TaskNormal (), 1000, 5000, TimeUnit.milliseconds); // 문제 3 : M_TIMER.SCHEDULEATFIXEDRATE (새로운 TaskUselongTime ( "Timer1"), 1000, 5000, TimeUnit.milliseconds); M_TIMER.SCHEDUEATFIXEDRATE ( "Timer2"), 1000, 5000, TimeUnit.milliseConds); Callable <integer>, runnable {private String m_taskName = "Timer"; private taskUselongTime () {} private taskName (string taskName) {m_taskName = taskName;} public void run () {system.out.println (getCurrentTime ()+":"+M_Taskname+" Sec {system.out.println (getCurrentTime ()+": 작업 일반 실행");}}@suppresswarnings ( "Unused") 개인 클래스 작업에서 <integer>, runnable {public integer call ()는 예외 {system.out.println (getCurrent ()+"); run () {system.out.println (getCurrentTime ()+"+"); 새로운 runtimeexception ();}} 개인 문자열 getCurrentTime () {return new simpledateformat ( "hh : mm : ss"). format (new Date ());}}.요약
위의 내용은 Java 타이머의 개발 역사에 대한이 기사의 간단한 토론에 관한 것이며, 모든 사람에게 도움이되기를 바랍니다. 관심있는 친구들은이 사이트를 계속 참조 할 수 있습니다.
Java는 간단한 타이머 코드 구문 분석을 구현합니다
Java 멀티 스레드 타이머 타이머의 원리 및 구현
Java 타이머 타이머 사용 방법의 코드 예
단점이 있으면 메시지를 남겨 두십시오. 이 사이트를 지원해 주신 친구들에게 감사드립니다!