scheduleAtFixedRate와 스케줄고정 지연 포함
와의 주된 차이점은 무엇입니까?scheduleAtFixedRate
그리고.scheduleWithFixedDelay
Scheduled Executor Service 메서드?
scheduler.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
System.out.println("scheduleAtFixedRate: " + new Date());
}
}, 1, 3L , SECONDS);
scheduler.scheduleWithFixedDelay(new Runnable() {
@Override
public void run() {
System.out.println("scheduleWithFixedDelay: " + new Date());
}
}, 1, 3L , SECONDS);
정확히 같은 시간에 인쇄되고 정확히 같은 간격으로 실행되는 것 같습니다.
추가해 보세요.Thread.sleep(1000);
내부로 전화run()
메서드...기본적으로 이전 실행이 종료되는 시점과 시작되는 시점의 차이입니다(논리적으로).
예를 들어, 알람을 1시간에 1번씩 일정한 비율로 울리도록 스케줄을 잡고, 알람이 울릴 때마다 커피 한 잔이 10분이 걸린다고 가정해 봅시다.자정에 시작한다고 가정하면, 나는 다음과 같이 할 수 있습니다.
00:00: Start making coffee
00:10: Finish making coffee
01:00: Start making coffee
01:10: Finish making coffee
02:00: Start making coffee
02:10: Finish making coffee
1시간의 일정 지연으로 일정을 잡으면 다음과 같이 됩니다.
00:00: Start making coffee
00:10: Finish making coffee
01:10: Start making coffee
01:20: Finish making coffee
02:20: Start making coffee
02:30: Finish making coffee
어떤 것을 원하는지는 당신의 업무에 달려있다.
호출의 시계열 시각화scheduleAtFixedRate
방법.마지막 실행이 기간보다 오래 걸릴 경우 다음 실행이 즉시 시작됩니다.그렇지 않으면 기간 후에 시작됩니다.
호출의 시계열scheduleWithFixedDelay
방법.다음 실행은 실행 시간에 관계없이 하나의 실행이 종료되고 다음 실행이 시작될 때까지의 지연 시간 후에 시작됩니다.
Hope가 도와줄 수 있어
그scheduleAtFixedRate()
method는 이전 작업이 완료되었는지 여부에 관계없이 새 작업을 생성하여 매 기간마다 실행자에게 제출합니다.
한편,scheduleWithFixedDelay()
method는 이전 작업이 완료된 후 새 작업을 생성합니다.
Java Doc를 읽으면 더 명확해집니다.
ScheduleFuture ScheduleAtFixedRate(Runnable 명령어, long initialDelay, long period, TimeUnit 유닛) 처음에 이니블이 되고 그 후에 initialDelay + period, initialDelay + 2 * period, initialDelay + 2 * period, init, init, init, init, init, init, init, init, initialDelay + period, interiod, init, init, init, interiod등등.
예정 미래 스케줄WithFixedDelay(실행 가능 명령어, long initialDelay, long delay, TimeUnit unit) 첫 번째 초기 지연 후 첫 번째 실행 종료와 다음 실행 시작 사이의 지정된 지연으로 활성화되는 정기적인 액션을 만들고 실행합니다.
스케줄 AtFixedRate에는 첫 번째 스레드가 너무 오래 걸리고 일정 기간 내에 종료되지 않으면 첫 번째 작업이 완료되고 첫 번째 스레드가 작업을 완료하고 gievn 기간이 경과하는 동안 두 번째 강제 스레드는 즉시 시작되지 않습니다.JVM 다음 작업이 언제 실행될지 결정합니다.
그게 방법을 선택하는 데 도움이 될 것 같아 왜냐하면 이것 때문에 큰 문제가 생겼거든.
간단한 프로그램을 작성하겠습니다.
import java.util.concurrent.Executors
import java.util.concurrent.TimeUnit
var time = 0L
var start = System.currentTimeMillis()
val executor = Executors.newScheduledThreadPool(1)
executor.scheduleWithFixedDelay({
if (time >= 12_000L) {
executor.shutdown()
} else {
Thread.sleep(2000L)
val now = System.currentTimeMillis()
time += now - start
System.out.println("Total $time delay ${now - start}\n")
start = now
}
}, 0L, 1000L, TimeUnit.MILLISECONDS)
그 결과를 봐 주세요.
| scheduleWithFixedDelay | scheduleAtFixedRate |
|:----------------------:|:----------------------:|
| Total 2001 delay 2001 | Total 2003 delay 2003 |
| Total 5002 delay 3001 | Total 4004 delay 2001 |
| Total 8003 delay 3001 | Total 6004 delay 2000 |
| Total 11003 delay 3000 | Total 8004 delay 2000 |
| Total 14003 delay 3000 | Total 10005 delay 2001 |
| --- | Total 12005 delay 2000 |
실행 시간이 대기 시간보다 길다는 점에 유의하십시오.
스케줄With Fixed Delay는 지연을 유지합니다.
scheduleAtFixedRate는 지연을 제거합니다.
당신의 전제는 알 수 있지만 당신의 결론은 정확하지 않습니다.여기 이 튜토리얼에 따르면 이 두 가지 차이점을 이해하기 위한 훌륭하고 완벽한 설명이 있습니다.
scheduleAtFixedRate(실행가능, long initialDelay, long period, TimeUnit 시간단위)
이 메서드는 정기적으로 실행되도록 태스크를 예약합니다.작업은 initialDelay 후 처음 실행되며 기간이 만료될 때마다 반복 실행됩니다.지정된 태스크 실행 중 하나에서 예외가 발생하면 태스크가 더 이상 실행되지 않습니다.예외가 발생하지 않으면 ScheduledExecutorService가 종료될 때까지 작업이 계속 실행됩니다.예약된 실행 간격보다 작업 실행에 시간이 오래 걸리는 경우 현재 실행이 완료된 후 다음 실행이 시작됩니다.스케줄링된 작업은 한 번에 두 개 이상의 스레드에 의해 실행되지 않습니다.
스케쥴With Fixed Delay(실행 가능, 긴 initial Delay, 긴 기간, Time Unit 시간 단위)
이 메서드는 기간이 다르게 해석된다는 점을 제외하고는 scheduleAtFixedRate()와 매우 유사합니다.scheduleAtFixedRate() 메서드에서 기간은 이전 실행 시작부터 다음 실행 시작까지의 지연으로 해석됩니다.단, 이 방법에서 기간은 이전 실행의 종료에서 다음 실행의 시작까지의 지연으로 해석됩니다.따라서 지연은 실행 시작 간격이 아니라 종료된 실행 간입니다.
scheduledExecutorService.scheduleAtFixedRate(() -> {
System.out.println("runnable start"); try { Thread.sleep(5000); System.out.println("runnable end");} catch
(InterruptedException e) { // TODO Auto-generated catch block
e.printStackTrace(); }}, 2, 7, TimeUnit.SECONDS);
scheduledExecutorService.scheduleWithFixedDelay(() -> {
System.out.println("runnable start"); try { Thread.sleep(5000); System.out.println("runnable end");} catch
(InterruptedException e) { // TODO Auto-generated catch block
e.printStackTrace(); } }, 2, 7, TimeUnit.SECONDS);
실행만 하면 차이를 알 수 있습니다.감사합니다.
언급URL : https://stackoverflow.com/questions/24649842/scheduleatfixedrate-vs-schedulewithfixeddelay
'sourcecode' 카테고리의 다른 글
docker-entrypoint-initdb의 MySQL 스크립트가 실행되지 않음 (0) | 2022.09.13 |
---|---|
Panda DataFrame에서 True/False를 1/0에 매핑하려면 어떻게 해야 합니까? (0) | 2022.09.13 |
Linux Mint에서 MariaDB를 시작할 때 /etc/mysql/debian-start에서 이 오류가 발생하는 이유는 무엇입니까? (0) | 2022.09.13 |
MariaDB CURRENT_TIMESTamp 기본값 (0) | 2022.09.13 |
다른 js 파일에서 JavaScript 함수 호출 (0) | 2022.09.13 |