일정 시간이 지난 후, 특정 코드를 실행시키는 방법에 대해서 알아보겠습니다.

1. Timer를 이용한 방법

특정 시간 후, 한번 실행

Timer.schedule(TimerTask, delay)는 delay 시간 후에 TimerTask의 run() 함수를 실행시킵니다.

  • TimerTask는 람다식으로 전달할 수 있음
  • delay의 시간 단위는 ms

아래 예제는 5초 뒤에 run() 함수가 실행됩니다.

import java.util.Timer;
import java.util.TimerTask;

public class Example {

    public static void main(String[] args) {

        Timer timer = new Timer();
        long delay = 5000; // 5초 (5000ms)

        // 5초 후 아래 함수가 한번만 실행됨
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println("Task executed.");
            }
        }, delay);
    }
}

Output:

Task executed.

특정 주기로 반복 실행

Timer.scheduleAtFixedRate(TimerTask, delay, period)는 delay 뒤에 TimerTask의 함수가 실행되며, 그 이후에 period 시간 주기로 반복 실행됩니다.

아래 예제는 5초 후에 처음 함수가 호출되며, 그 이후에 10초 간격마다 함수가 주기적으로 호출됩니다.

import java.util.Timer;
import java.util.TimerTask;

public class Example {

    public static void main(String[] args) {

        Timer timer = new Timer();
        long delay = 5000; // 5초 (5000ms)
        long period = 10000; // 10초

        // 5초 후 아래 함수가 처음 호출 되며, 10초 간격으로 반복 호출
        timer.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                System.out.println("Task executed.");
            }
        }, delay, period);
    }
}

Output:

Task executed.
Task executed.
Task executed.
Task executed.
...

2. Executors를 이용한 방법

특정 시간 후, 한번 실행

ScheduledExecutorService를 이용하여 특정 시간 후에 코드를 실행시킬 수 있습니다.

schedule(Runnable, delay, TimeUnit)은 delay 후에 Runnable의 함수를 호출합니다. TimeUnit은 delay의 시간 단위입니다.

  • delay가 5이고 TimeUnit이 TimeUnit.SECONDS 이면, delay는 5초가 됩니다.

아래 예제는 5초 후에 함수를 한번 실행시킵니다.

import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class Example {

    public static void main(String[] args) {

        ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
        long delay = 5;

        // 5초 후 아래 함수 한번 실행
        executorService.schedule(new Runnable() {
            @Override
            public void run() {
                System.out.println("Task executed.");
            }
        }, delay, TimeUnit.SECONDS);
    }
}

Output:

Task executed.

특정 주기로 반복 실행

ScheduledExecutorService 또한 주기적으로 함수를 실행시킬 수 있습니다.

scheduleAtFixedRate(Runnable, delay, period, TimeUnit)은 delay 후에 Runnable의 함수를 호출하며, 그 이후에 period 시간 간격마다 주기적으로 함수를 호출합니다.

  • delay가 5이고 TimeUnit이 TimeUnit.SECONDS 이면, delay는 5초가 됩니다.

아래 예제는 5초 후에 함수를 처음 실행시키고, 그 이후에 10초 간격마다 반복 호출합니다.

import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class Example {

    public static void main(String[] args) {

        ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);
        long delay = 5;
        long period = 10;

        // 5초 후 아래 함수 처음 실행, 그 이후 10초 간격으로 반복 실행
        executorService.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {
                // 일정 시간이 지난 후 실행할 코드 작성
                System.out.println("Task executed.");
            }
        }, delay, period, TimeUnit.SECONDS);
    }
}

Output:

Task executed.
Task executed.
Task executed.
Task executed.
...