노션으로 다시 돌아갔습니다 😅

Thread 생성 및 실행

by mignon25

작업 스레드의 생성과 실행

기본적으로 작성하는 자바 파일들은 메인 메서드를 시작점으로 메인 스레드가 싱글스레드로 처리한다. 

이외의 별도의 작업 스레드를 활용하려면

작업스레드가 수행할 코드를 별도로 작성하고, 작업 스레드를 별도로 생성하여 실행시켜 주어야 한다. 

 

작업스레드는 Runnable 인터페이스와 Thread 클래스 안에 정의된 run() 메서드를 오버라이딩하여 구현한 후 해당 run() 메서드의 내용대로 실행하게 된다.  

run() 메서드가 두 군데에 정의되어 있으므로 작업스레드를 생성하는 방법도 두 가지이다. 

 

  1. Runnable 인터페이스를 구현한 객체에서 run() 을 구현하여 스레드를 생성하고 실행
  2. Thread 클래스를 상속받은 하위 클래스에서 run() 을 구현하여 스레드를 생성하고 실행

 

각각의 예시를 살펴보자. 

 

 

1. Runnable 인터페이스를 구현한 객체에서 run() 메서드 구현하여 스레드 생성/실행

1. Runnable 인터페이스를 구현한 클래스에서 run() 메서드 구현하고 바디에 수행코드 작성

// Runnable 인터페이스를 구현하는 클래스
class ThreadTask1 implements Runnable {

    // run() 메서드 바디에 스레드가 수행할 작업 내용 작성
    public void run() {
        for(int i = 0; i < 100; i++) {
            System.out.print("#");
        }
    }
}

2. 스레드 생성

  • Runnable 인터페이스 구현 객체 생성
  • Thread 클래스 인스턴스화(위에서 생성한 객체 인자로 전달)하여 스레드 생성
public class ThreadExample1 {
    public static void main(String[] args) {

        // Runnable 인터페이스를 구현한 객체 생성
        Runnable task1 = new ThreadTask1();

        // Runnable 구현 객체를 인자로 전달하면서 Thread 클래스를 인스턴스화하여 스레드를 생성
        Thread thread1 = new Thread(task1);

        // 위의 두 줄을 아래와 같이 한 줄로 축약 가능
        // Thread thread1 = new Thread(new ThreadTask1());

    }
}

3. 스레드 실행

  • start() 메서드 호출
  • main 메서드에 반복문 코드 추가하여 실행결과 확인
public class ThreadExample1 {
    public static void main(String[] args) {

        Runnable task1 = new ThreadTask1();
        Thread thread1 = new Thread(task1);

        // 작업 스레드 실행시켜 run() 내부 코드 실행되도록 하기
        thread1.start();

        // 반복문 추가
        for(int i = 0; i < 100; i++) {
            System.out.print("@");
        }

        // 출력결과
        // @#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
        // @@@@@@@@##############################@@@@@@@@@@@@
        // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@###################
        // ##################################################
    }
}

@ : main 메서드 반복문에서 출력, # : 메인 스레드의 반복문에서 출력

=> 메인 스레드와 작업 스레드가 동시에 병렬로 실행되었기 때문.

 

 

2. Thread 클래스를 상속 받은 하위 클래스에서 run()을 구현하여 스레드 생성/실행

1. Thread 클래스를 상속받는 하위 클래스를 만들고,  run() 메서드 오버라이딩

// Thread 클래스를 상속받는 클래스 작성
class ThreadTask2 extends Thread {
    
    // run() 메서드 바디에 스레드가 수행할 작업 내용 작성
    public void run() {
        for(int i = 0; i < 100; i++) {
            System.out.println("#");
        }
    }
}

2. 스레드 생성

  • Thread 클래스를 직접 인스턴스화 X
  • Thread 클래스를 상속받은 클래스를 인스턴스화하여 스레드 생성
public class ThreadExample2 {
    public static void main(String[] args) {

        // Thread 클래스를 상속받은 클래스를 인스턴스화하여 스레드를 생성
        ThreadTask2 thread2 = new ThreadTask2();

    }
}

3. 스레드 실행

  • start() 메서드 호출
  • main 메서드에 반복문 코드 추가하여 실행결과 확인
public class ThreadExample2 {
    public static void main(String[] args) {

        // Thread 클래스를 상속받은 클래스를 인스턴스화하여 스레드를 생성
        ThreadTask2 thread2 = new ThreadTask2();

        // 작업 스레드를 실행시켜, run() 내부 코드 처리하도록 한다.
        thread2.start();

        // 반복문 추가
        for(int i = 0; i < 100; i++) {
            System.out.print("@");
        }
    }
}

결과는 위와 동일하다. 

 

 

 

3. 익명 객체를 사용하여 스레드 생성하고 실행하기

작업 스레드의 동작을 구현하기 위해 땨로 클래스를 정의하지 않고 익명 객체를 활용하여 바로 스레드를 생성하고 실행시킬 수도 있다. 

 

1. Runnable 익명 구현 객체를 활용한 스레드 생성 및 실행

public class ThreadExample3 {
    public static void main(String[] args) {

        // 익명 Runnable 구현 객체를 활용하여 스레드 생성
        Thread thread1 = new Thread(new Runnable() {
            public void run() {
                for(int i = 0; i < 100; i++) {
                    System.out.print("#");
                }
            }
        });

        thread1.start();

        // 익명 Runnable 구현 객체 활용 스레드 생성 2 - 람다식 테스트
        Thread thread2 = new Thread(() -> {
            for(int i = 0; i<100; i++) {
                System.out.print("$");
            }
        });

        thread2.start();
    }
}

Runnable 인터페이스가 run() 추상메서드 하나뿐이니까 람다식으로도 되나? 싶어서 바꾸어 봤는데 람다식으로도 된다~

 

2. Thread 익명 하위 객체를 활용한 스레드 생성 및 실행

public class ThreadExample4 {
    public static void main(String[] args) {

        // 익명 Thread 하위 객체를 활용한 스레드 생성
        Thread thread3 = new Thread() {
            public void run() {
                for(int i = 0; i < 100; i++) {
                    System.out.print("#");
                }
            }
        };
        
        thread3.start();
    }
}

 

블로그의 정보

Mignon'S Dev Log

mignon25

활동하기