Java - Thread - Sleep, Join

2 분 소요

Java - Thread - Sleep

  • Thread.sleep(), TimeUnit.SECONDS.sleep()를 사용해서 현재 Thread를 일정 시간 정지시켜 둘 수 있습니다.
package com.company;

import java.lang.*;
import java.util.Date;
import java.util.concurrent.TimeUnit;

public class Main {
    public static void main(String[] args) throws Exception {
        /*
        - 현재 Thread는 mainThread입니다.
        Thread.sleep(), TimeUnit.SECONDS.sleep()를 사용해서
        현재 Thread를 일정 시간 정지시켜 둘 수 있습니다.
        */
        // main Thread
        Date startDate = new Date(System.currentTimeMillis());
        System.out.printf("Start Time: %s \n", startDate);
        // Thread의 instance를 sleep하는 것이 아니라,
        // Thread class의 static function에 접근하여 sleep을 사용합니다.
        // 1000 millis = 1 sec
        System.out.println("== Thread.sleep(3000) ==================");
        Thread.sleep(3000);
        Date midDate1 = new Date(System.currentTimeMillis());
        System.out.printf("midDate1:   %s \n", midDate1);

        System.out.println("== TimeUnit.SECONDS.sleep(2) ===========");
        // TimeUnit에는 MINUTES, HOURS 등 다양하게 있습니다.
        TimeUnit.SECONDS.sleep(2);
        Date midDate2 = new Date(System.currentTimeMillis());
        System.out.printf("midDate2:   %s \n", midDate2);

        Date endDate = new Date(System.currentTimeMillis());
        System.out.printf("end Time:   %s \n", endDate);
    }
}
  • 결과를 보면 다음처럼 일정 시간동안 멈췄다가 실행되는 것을 알 수 있습니다.
Start Time: Sun Jan 17 14:31:41 KST 2021 
== Thread.sleep(3000) ==================
midDate1:   Sun Jan 17 14:31:44 KST 2021 
== TimeUnit.SECONDS.sleep(2) ===========
midDate2:   Sun Jan 17 14:31:46 KST 2021 
end Time:   Sun Jan 17 14:31:46 KST 2021 

Java - Thread - Join

  • threadA에서 threadB.join()를 실행하면, threadB가 종료될때까지, threadA의 실행이 멈추게 됩니다.
  • 우선 ThreadA라는 class를 만들어줍니다. 시작되면 시작 시간을 출력하고, 2second동안 sleep한 다음 종료 시간을 출력해줍니다.
// ThreadA.java
import java.util.Date;

public class ThreadA extends Thread {
    private String name;
    @Override
    public void run(){
        Date startDate = new Date(System.currentTimeMillis());
        System.out.printf("ThreadA     starts at %s \n", startDate);
        try {
            // .sleep()에서 InterruptedException가 발생할 수 있으므로
            // 예외처리를 해줍니다.
            Thread.sleep(2000);
            Date endDate = new Date(System.currentTimeMillis());
            System.out.printf("ThreadA       ends at %s \n", endDate);
        } catch (Exception InterruptedException) {
            System.out.println("InterruptedException");
        }
    }
}
  • 그리고 main Thread는 다음과 같이 정의해줍니다. 현재는 .join()을 사용하지 않았기 때문에, 실행하면 MainThreadThreadA가 그냥 개별적으로 수행되죠. 따라서,
package com.company;

import java.lang.*;
import java.util.Date;

public class Main {
    public static void main(String[] args) throws Exception {
        Date startDate = new Date(System.currentTimeMillis());
        System.out.printf("Main Thread starts at %s \n", startDate);
        ThreadA threadA = new ThreadA();
        threadA.start();
        // threadA.join()을 실행하면, 
        // threadA가 종료될 때 까지, 이 뒷부분의 코드는 실행되지 않습니다.
        // 하지만, 마냥 기다릴 수는 없으니까요, 만약 threadA.join(100)과 같이 처리하면
        // 기다리다가 100을 넘기면 그냥 무시하고 뒤 부분의 코드가 실행됩니다.
        // threadA.join();

        Date endDate = new Date(System.currentTimeMillis());
        System.out.printf("Main Thread   ends at %s \n", endDate);

    }
}
  • 아래에서 보시는 것처럼, Main Thread가 먼저 종료되고, 그 다음에 ThreadA가 실행되고 종료되죠.
Main Thread starts at Sun Jan 17 15:07:11 KST 2021 
Main Thread   ends at Sun Jan 17 15:07:11 KST 2021 
ThreadA     starts at Sun Jan 17 15:07:11 KST 2021 
ThreadA       ends at Sun Jan 17 15:07:13 KST 2021 
  • comment 처리한 threadA.join() 부분을 넣어서 실행해주면 다음과 같이, ThreadA가 종료된 다음 Main Thread가 종료되는 것을 알 수 있습니다.
Main Thread starts at Sun Jan 17 15:08:32 KST 2021 
ThreadA     starts at Sun Jan 17 15:08:32 KST 2021 
ThreadA       ends at Sun Jan 17 15:08:34 KST 2021 
Main Thread   ends at Sun Jan 17 15:08:34 KST 2021 

댓글남기기