Java 타이머 요약
Java 스레드에서 작업 실행 시간 또는 주기를 지정하는 데 주로 사용됩니다.Timer는 스레드가 안전하지만 실시간 (real-time) 보증은 제공하지 않습니다.
구조 함수
Timer()
기본 구조 함수.
Timer(boolean)
관련 라인을 데몬 라인으로 지정합니다.
Timer(String)
관련 스레드의 이름을 지정합니다.
Timer(String, boolean)
관련 루틴의 이름과 데몬을 지정합니다.
schdule 방법
schedule(TimerTask task, long delay)
현재 시간을 기준으로 지정된 밀리초 지연된 후 TimerTask 작업을 수행합니다.
schedule(TimerTask task, Date time)
지정된 날짜에 TimerTask 작업을 수행합니다.
날짜 시간이 현재 시간보다 빠르면 즉시 실행합니다.
사용 예
public class Demo {
private static Timer timer = new Timer();
public static class MyTask extends TimerTask {
@Override
public void run() {
System.out.println("Run Time:" + new Date().toString());
}
}
public static void main(String[] args) {
try {
MyTask task = new MyTask();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateStr = "2016-12-27 14:36:00";
Date date = sdf.parse(dateStr);
System.out.println("Date = " + date.toString() + " NowTime = " + new Date().toString());
timer.schedule(task, date);
} catch (ParseException e) {
e.printStackTrace();
}
}
}
실행 결과
Date = Tue Dec 27 14:36:00 CST 2016 NowTime = Tue Dec 27 21:28:04 CST 2016
Run Time:Tue Dec 27 21:28:04 CST 2016
즉각 집행한다는 뜻이다.schedule(TimerTask task, long delay, long period)
현재 시간을 기준으로 지정된 밀리초를 지연한 후 지정된 시간 간격으로 TimerTask 작업을 무한대로 수행합니다.(fixed-delay execution)
사용 예
public class Demo {
private static Timer timer = new Timer();
public static class MyTask extends TimerTask {
@Override
public void run() {
System.out.println("Run Time: " + new Date().toString());
}
}
public static void main(String[] args) {
MyTask task = new MyTask();
System.out.println("Now Time: " + new Date().toString());
timer.schedule(task, 3000, 5000);
}
}
실행 결과
Now Time: Tue Dec 27 21:34:59 CST 2016
Run Time: Tue Dec 27 21:35:02 CST 2016
Run Time: Tue Dec 27 21:35:07 CST 2016
Run Time: Tue Dec 27 21:35:12 CST 2016
Run Time: Tue Dec 27 21:35:17 CST 2016
설명은 현재 기준 시간으로 3초 지연된 후 한 번, 이후 지정된 간격으로 5초 무한 횟수로 실행됩니다.schedule(TimerTask task, Date firstTime, long period)
지정된 날짜 이후에 지정된 시간 간격으로 TimerTask 작업을 무한대로 수행합니다.(fixed-delay execution)
날짜firstTime이 현재 시간보다 빠르면 즉시 실행하고 시간차 내의 작업을 실행하지 않습니다.
사용 예
public class Demo {
private static Timer timer = new Timer();
public static class MyTask extends TimerTask {
@Override
public void run() {
System.out.println("Run Time:" + new Date().toString());
}
public static void main(String[] args) {
try {
MyTask task = new MyTask();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateStr = "2016-12-27 14:36:00";
Date date = sdf.parse(dateStr);
System.out.println("Date = " + date.toString() + " NowTime = " + new Date().toString());
timer.schedule(task, date, 3000);
} catch (ParseException e) {
e.printStackTrace();
}
}
}
}
실행 결과
Date = Tue Dec 27 14:36:00 CST 2016 NowTime = Tue Dec 27 21:43:30 CST 2016
Run Time:Tue Dec 27 21:43:30 CST 2016
Run Time:Tue Dec 27 21:43:33 CST 2016
Run Time:Tue Dec 27 21:43:36 CST 2016
지정한 사이가 현재 시간보다 빠르면 즉시 실행되며 시간차 내의 임무를 보충하지 않습니다.scheduleAtFixedRate 방법
scheduleAtFixedRate(TimerTask task, long delay, long period)
현재 시간을 기준으로 지정된 밀리초를 지연한 후 지정된 시간 간격에 따라 주기적으로 TimerTask 작업을 무한대로 수행합니다.(fixed-rate execution)
사용 예
public class Demo {
private static Timer timer = new Timer();
public static class MyTask extends TimerTask {
@Override
public void run() {
System.out.println("Run Time: " + new Date().toString());
}
}
public static void main(String[] args) {
MyTask task = new MyTask();
System.out.println("Now Time: " + new Date().toString());
timer.scheduleAtFixedRate(task, 3000, 5000);
}
}
실행 결과
Now Time: Tue Dec 27 21:58:03 CST 2016
Run Time: Tue Dec 27 21:58:06 CST 2016
Run Time: Tue Dec 27 21:58:11 CST 2016
Run Time: Tue Dec 27 21:58:16 CST 2016
Run Time: Tue Dec 27 21:58:21 CST 2016
설명은 현재 기준 시간으로 3초 지연된 후 한 번, 이후 지정된 간격으로 5초 무한 횟수로 실행됩니다.scheduleAtFixedRate(TimerTask task, Date firstTime, long period)
지정된 날짜 이후에 지정된 시간 간격에 따라 주기적으로 TimerTask 작업을 무한대로 수행합니다.(fixed-rate execution)
날짜firstTime이 현재 시간보다 빠르면 즉시 실행하고 시간차 내의 작업을 보충적으로 수행합니다.
사용 예
public class Demo {
private static Timer timer = new Timer();
public static class MyTask extends TimerTask {
@Override
public void run() {
System.out.println("Run Time:" + new Date().toString());
}
public static void main(String[] args) {
try {
MyTask task = new MyTask();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateStr = "2016-12-27 22:02:00";
Date date = sdf.parse(dateStr);
System.out.println("Date = " + date.toString() + " NowTime = " + new Date().toString());
timer.scheduleAtFixedRate(task, date, 5000);
} catch (ParseException e) {
e.printStackTrace();
}
}
}
}
실행 결과
Date = Tue Dec 27 22:02:00 CST 2016 NowTime = Tue Dec 27 22:02:54 CST 2016
Run Time:Tue Dec 27 22:02:54 CST 2016
Run Time:Tue Dec 27 22:02:54 CST 2016
Run Time:Tue Dec 27 22:02:54 CST 2016
Run Time:Tue Dec 27 22:02:54 CST 2016
Run Time:Tue Dec 27 22:02:54 CST 2016
Run Time:Tue Dec 27 22:02:54 CST 2016
Run Time:Tue Dec 27 22:02:54 CST 2016
Run Time:Tue Dec 27 22:02:54 CST 2016
Run Time:Tue Dec 27 22:02:54 CST 2016
Run Time:Tue Dec 27 22:02:54 CST 2016
Run Time:Tue Dec 27 22:02:54 CST 2016
Run Time:Tue Dec 27 22:02:55 CST 2016
Run Time:Tue Dec 27 22:03:00 CST 2016
Run Time:Tue Dec 27 22:03:05 CST 2016
지정한 사이가 현재 시간보다 빠르면 즉시 실행됩니다.시간 22:02:00-22:02:54 내에 약 11개의 5초 간격이 있으면 시간차 내의 임무를 우선적으로 보충적으로 수행한 후 22:02:55에 보충(12회 수행. ps:0-55초 구간에서 수위를 모두 계산하여 12회 촉발), 이후 5초 간격으로 정시 임무를 수행한다.
작업 지연 시간 대비 schedule 및 scheduleAtFixedRate
schedule 시간 지연 없음
사용 예
public class Demo {
private static Timer timer = new Timer();
private static int runCount = 0;
public static class MyTask extends TimerTask {
@Override
public void run() {
try {
System.out.println("Begin Run Time: " + new Date().toString());
Thread.sleep(3000);
System.out.println("End Run Time: " + new Date().toString());
runCount++;
if (runCount == 3) {
timer.cancel();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
try {
MyTask task = new MyTask();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateStr = "2016-12-27 14:36:00";
Date date = sdf.parse(dateStr);
System.out.println("Date = " + date.toString() + " NowTime = " + new Date().toString());
timer.schedule(task, date, 5000);
} catch (ParseException e) {
e.printStackTrace();
}
}
}
실행 결과현재 데이텀 시간 이전
Date = Tue Dec 27 14:36:00 CST 2016 NowTime = Tue Dec 27 22:23:37 CST 2016
Begin Run Time: Tue Dec 27 22:23:37 CST 2016
End Run Time: Tue Dec 27 22:23:40 CST 2016
Begin Run Time: Tue Dec 27 22:23:42 CST 2016
End Run Time: Tue Dec 27 22:23:45 CST 2016
Begin Run Time: Tue Dec 27 22:23:47 CST 2016
End Run Time: Tue Dec 27 22:23:50 CST 2016
Process finished with exit code 0
현재 데이텀 시간 미만
Date = Tue Dec 27 22:42:00 CST 2016 NowTime = Tue Dec 27 22:41:54 CST 2016
Begin Run Time: Tue Dec 27 22:42:00 CST 2016
End Run Time: Tue Dec 27 22:42:03 CST 2016
Begin Run Time: Tue Dec 27 22:42:05 CST 2016
End Run Time: Tue Dec 27 22:42:08 CST 2016
Begin Run Time: Tue Dec 27 22:42:10 CST 2016
End Run Time: Tue Dec 27 22:42:13 CST 2016
Process finished with exit code 0
기준 시간보다 이르든 늦든 보상을 하지 않고 다음 임무의 집행 시간은 지난 임무의 시작 시점을 참고하여 계산한다.schedule 지연 시간
사용 예
public class Demo {
private static Timer timer = new Timer();
private static int runCount = 0;
public static class MyTask extends TimerTask {
@Override
public void run() {
try {
System.out.println("Begin Run Time: " + new Date().toString());
Thread.sleep(5000);
System.out.println("End Run Time: " + new Date().toString());
runCount++;
if (runCount == 3) {
timer.cancel();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
try {
MyTask task = new MyTask();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateStr = "2016-12-27 22:42:00";
Date date = sdf.parse(dateStr);
System.out.println("Date = " + date.toString() + " NowTime = " + new Date().toString());
timer.schedule(task, date, 3000);
} catch (ParseException e) {
e.printStackTrace();
}
}
}
실행 결과현재 데이텀 시간 이전
Date = Tue Dec 27 22:42:00 CST 2016 NowTime = Tue Dec 27 22:45:17 CST 2016
Begin Run Time: Tue Dec 27 22:45:17 CST 2016
End Run Time: Tue Dec 27 22:45:22 CST 2016
Begin Run Time: Tue Dec 27 22:45:22 CST 2016
End Run Time: Tue Dec 27 22:45:27 CST 2016
Begin Run Time: Tue Dec 27 22:45:27 CST 2016
End Run Time: Tue Dec 27 22:45:32 CST 2016
Process finished with exit code 0
현재 데이텀 시간 미만
Date = Tue Dec 27 22:47:00 CST 2016 NowTime = Tue Dec 27 22:46:27 CST 2016
Begin Run Time: Tue Dec 27 22:47:00 CST 2016
End Run Time: Tue Dec 27 22:47:05 CST 2016
Begin Run Time: Tue Dec 27 22:47:05 CST 2016
End Run Time: Tue Dec 27 22:47:10 CST 2016
Begin Run Time: Tue Dec 27 22:47:10 CST 2016
End Run Time: Tue Dec 27 22:47:15 CST 2016
Process finished with exit code 0
현재 기준 시간보다 이르든 늦든 보상을 하지 않고 다음 임무의 집행 시간은 지난 임무가 끝난 시점을 참고하여 계산한다.scheduleAtFixedRate 지연 시간 없음
사용 예
public class Demo {
private static Timer timer = new Timer();
private static int runCount = 0;
public static class MyTask extends TimerTask {
@Override
public void run() {
try {
System.out.println("Begin Run Time: " + new Date().toString());
Thread.sleep(3000);
System.out.println("End Run Time: " + new Date().toString());
runCount++;
if (runCount == 1000) {
timer.cancel();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
try {
MyTask task = new MyTask();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateStr = "2016-12-27 22:51:42";
Date date = sdf.parse(dateStr);
System.out.println("Date = " + date.toString() + " NowTime = " + new Date().toString());
timer.scheduleAtFixedRate(task, date, 5000);
} catch (ParseException e) {
e.printStackTrace();
}
}
}
실행 결과현재 데이텀 시간 이전
Date = Tue Dec 27 22:51:42 CST 2016 NowTime = Tue Dec 27 22:51:57 CST 2016
Begin Run Time: Tue Dec 27 22:51:57 CST 2016
End Run Time: Tue Dec 27 22:52:00 CST 2016
Begin Run Time: Tue Dec 27 22:52:00 CST 2016
End Run Time: Tue Dec 27 22:52:03 CST 2016
Begin Run Time: Tue Dec 27 22:52:03 CST 2016
End Run Time: Tue Dec 27 22:52:06 CST 2016
Begin Run Time: Tue Dec 27 22:52:06 CST 2016
End Run Time: Tue Dec 27 22:52:09 CST 2016
Begin Run Time: Tue Dec 27 22:52:09 CST 2016
End Run Time: Tue Dec 27 22:52:12 CST 2016
Begin Run Time: Tue Dec 27 22:52:12 CST 2016
End Run Time: Tue Dec 27 22:52:15 CST 2016
Begin Run Time: Tue Dec 27 22:52:15 CST 2016
End Run Time: Tue Dec 27 22:52:18 CST 2016
Begin Run Time: Tue Dec 27 22:52:18 CST 2016
End Run Time: Tue Dec 27 22:52:21 CST 2016
Begin Run Time: Tue Dec 27 22:52:22 CST 2016
End Run Time: Tue Dec 27 22:52:25 CST 2016
Begin Run Time: Tue Dec 27 22:52:27 CST 2016
End Run Time: Tue Dec 27 22:52:30 CST 2016
Begin Run Time: Tue Dec 27 22:52:32 CST 2016
End Run Time: Tue Dec 27 22:52:35 CST 2016
Begin Run Time: Tue Dec 27 22:52:37 CST 2016
End Run Time: Tue Dec 27 22:52:40 CST 2016
Begin Run Time: Tue Dec 27 22:52:42 CST 2016
End Run Time: Tue Dec 27 22:52:45 CST 2016
Begin Run Time: Tue Dec 27 22:52:47 CST 2016
End Run Time: Tue Dec 27 22:52:50 CST 2016
Begin Run Time: Tue Dec 27 22:52:52 CST 2016
End Run Time: Tue Dec 27 22:52:55 CST 2016
Begin Run Time: Tue Dec 27 22:52:57 CST 2016
End Run Time: Tue Dec 27 22:53:00 CST 2016
Process finished with exit code 0
현재 데이텀 시간 미만
Date = Tue Dec 27 22:37:00 CST 2016 NowTime = Tue Dec 27 22:36:06 CST 2016
Begin Run Time: Tue Dec 27 22:37:00 CST 2016
End Run Time: Tue Dec 27 22:37:03 CST 2016
Begin Run Time: Tue Dec 27 22:37:05 CST 2016
End Run Time: Tue Dec 27 22:37:08 CST 2016
Begin Run Time: Tue Dec 27 22:37:10 CST 2016
End Run Time: Tue Dec 27 22:37:13 CST 2016
Process finished with exit code 0
지연되지 않은 상황에서 기준시간보다 일찍 시간차 내의 임무 수행이 보상되지 않았을 때 다음 임무 수행 시간은 지난 임무 수행 종료 시간을 참고한다.일단 보상이 완료되면(굵은 시간 주의), 다음 임무 수행 시간은 지난 임무 수행 시작 시간을 참고한다.데이텀 시간보다 늦을 때 다음 작업 수행 시간은 마지막 작업 시작 시간을 참조합니다.scheduleAtFixedRate 지연 시간
사용 예
public class Demo {
private static Timer timer = new Timer();
private static int runCount = 0;
public static class MyTask extends TimerTask {
@Override
public void run() {
try {
System.out.println("Begin Run Time: " + new Date().toString());
Thread.sleep(5000);
System.out.println("End Run Time: " + new Date().toString());
runCount++;
if (runCount == 3) {
timer.cancel();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
try {
MyTask task = new MyTask();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateStr = "2016-12-27 22:28:00";
Date date = sdf.parse(dateStr);
System.out.println("Date = " + date.toString() + " NowTime = " + new Date().toString());
timer.scheduleAtFixedRate(task, date, 3000);
} catch (ParseException e) {
e.printStackTrace();
}
}
}
실행 결과현재 데이텀 시간 이전
Date = Tue Dec 27 23:01:00 CST 2016 NowTime = Tue Dec 27 23:01:19 CST 2016
Begin Run Time: Tue Dec 27 23:01:19 CST 2016
End Run Time: Tue Dec 27 23:01:24 CST 2016
Begin Run Time: Tue Dec 27 23:01:24 CST 2016
End Run Time: Tue Dec 27 23:01:29 CST 2016
Begin Run Time: Tue Dec 27 23:01:29 CST 2016
End Run Time: Tue Dec 27 23:01:34 CST 2016
Begin Run Time: Tue Dec 27 23:01:34 CST 2016
End Run Time: Tue Dec 27 23:01:39 CST 2016
현재 데이텀 시간 미만
Date = Tue Dec 27 22:28:00 CST 2016 NowTime = Tue Dec 27 22:27:55 CST 2016
Begin Run Time: Tue Dec 27 22:28:00 CST 2016
End Run Time: Tue Dec 27 22:28:05 CST 2016
Begin Run Time: Tue Dec 27 22:28:05 CST 2016
End Run Time: Tue Dec 27 22:28:10 CST 2016
Begin Run Time: Tue Dec 27 22:28:10 CST 2016
End Run Time: Tue Dec 27 22:28:15 CST 2016
Process finished with exit code 0
시간 지연의 경우 기준 시간보다 이르더라도 시간 지연 효과로 인해 완료 시간차 내의 임무 집행을 보상할 수 없기 때문에 시간 지연 상황에서 다음 임무의 집행 시간은 모두 지난 임무가 끝난 시간을 참고하여 계산한다.비교 요약
작업 수행 시간 지연 없음
작업 지연 시간
현재 데이텀 시간 이전
schedule: 다음 작업의 실행 시간은 지난 작업의 시작 시간을 참고하여 계산합니다.schedule AtFixedRate: 기준 시간보다 일찍 시간차 내의 실행 작업이 보상되지 않았을 때 다음 실행 시간은 지난 작업의 종료 시간을 참고합니다.보상이 완료되면 다음 임무 수행 시간은 이전 임무의 시작 시간을 참고하여 계산합니다.
양자는 같다.다음 작업의 실행 시간은 지난 작업의 종료 시간을 참고하여 계산합니다.
현재 데이텀 시간 미만
양자는 같다.다음 작업의 실행 시간은 이전 작업의 시작 시간을 참고하여 계산합니다.
양자는 같다.다음 작업의 실행 시간은 지난 작업의 종료 시간을 참고하여 계산합니다.
이상은 본문의 전체 내용입니다. 본고의 내용이 여러분의 학습이나 업무에 일정한 도움을 줄 수 있는 동시에 저희를 많이 지지해 주시기 바랍니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
38. Java의 Leetcode 솔루션텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.