언어(Language)/Java

[Java] 자바 스레드(Thread)의 생성과 실행 방법 예제

잇트루 2022. 9. 29. 02:00
반응형

작업 스레드 생성과 실행

멀티 스레드를 구현하기 위해 작업 스레드가 수행할 코드를 작성하고, 작업 스레드를 생성하여 실행시켜야 한다.

자바의 모든 코드는 클래스 안에 작성해야 한다. 따라서 스레드가 수행할 코드 또한 클래스 내부에 작성해야 하며, run() 메서드를 통해 스레드가 처리할 작업을 작성해야 한다.

 

run()

run() 메서드는 Runnable 인터페이스와 Thread 클래스에 정의되어 있다.

작업 스레드를 생성하고 실행하려면,

Runnable 인터페이스를 구현한 객체에서 run() 메서드를 구현하여 스레드를 생성하고 실행하거나,

Thread 클래스를 상속받은 하위 클래스에서 run() 메서드를 구현하여 스레드를 생성하고 실행해야 한다.

 

Runnable 인터페이스를 활용하여 run() 메서드를 사용하는 방법

먼저 스레드를 생성하기 위해 Runnable 인터페이스를 구현할 객체를 만어야 한다.

이후 run() 메서드 바디에 새롭게 생성된 스레드가 수행할 코드를 작성한다.

Runnable 인터페이스를 구현한 객체를 생성하고 전달하여, Thread 클래스를 인스턴스화 한다.

마지막으로 start() 메서드를 호출하여 스레드를 실행시킨다.

public class ThreadEx {
    public static void main(String[] args) {
        // 3. Runnable 인터페이스를 구현한 객체 생성
        Runnable task = new MakeThread();
        // 4. Thread 클래스를 인스턴스화 하여 스레드 생성
        Thread thread = new Thread(task);

        // 한 번에 스레드를 생성할 수도 있음
        //Thread thread = new Thread(new MakeThread());

        // 5. run() 메서드 실행
        thread.start();
    }
}

// 1. Runnable 인터페스를 구현할 클래스
class MakeThread implements Runnable {
    // 2. run() 메서드에 스레드가 수행할 코드 작성
    public void run() {
        for (int i = 0; i <= 100; i++) {
            System.out.println(result);
        }
    }
}

 

위 코드의 메인 메서드 안에 다른 수행 코드를 작성한다.

public class ThreadEx {
    public static void main(String[] args) {
        Runnable task = new MakeThread();
        Thread thread = new Thread(task);
        thread.start();

        for (int i = 0; i <= 100; i++) {
            System.out.println("Main");
        }
    }
}

class MakeThread implements Runnable {
    public void run() {
        for (int i = 0; i <= 100; i++) {
            System.out.println(i);
        }
    }
}

위 코드를 실행하면, 메인 메서드의 반복문 출력과 스레드의 run() 메서드의 출력이 섞여서 나타날 것이다.

이는 메인 스레드와 작업 스레드가 동시에 병렬적으로 실행되었기 때문에 숫자와 문자가 섞여서 출력된 것이다.

 

Thread 클래스를 상속받아 하위 클래스에서 run() 메서드를 구현하는 방법

먼저, Thread 클래스를 상속받는 하위 클래스를 생성한다. Thread 클래스에는 run() 메서드가 정의되어 있기 때문에 메서드 오버라이딩을 해주어야 한다.

이후 run() 메서드 바디에 새롭게 생성된 스레드가 수행할 코드를 작성한다.

작성을 마친 후, 메인 메서드에서 Thread 클래스를 상속받은 클래스를 인스턴스화 한다.

마지막으로 start() 메서드를 호출하여 스레드를 실행시킨다.

public class ThreadEx {
    public static void main(String[] args) {
        // Thread 클래스를 상속 받은 클래스를 인스턴스화 한다.
        Thread thread = new MakeThread();

        // start() 메서드를 통해 스레드를 실행시킨다.
        thread.start();

        // 메인 스레드가 작업할 반복문
        for (int i = 0; i <= 100; i++) {
            System.out.println("Main");
        }
    }
}

// 1. Thread 클래스를 상속 받는 하위 클래스를 생성한다.
class MakeThread extends Thread {
    // 2. run() 메서드를 오버라이딩 하여 생성된 스레드가 수행할 코드를 작성한다.
    public void run() {
        for (int i = 0; i <= 100; i++) {
            System.out.println("ThreadTask");
        }
    }
}

 

익명 객체 스레드 생성 및 실행

생성된 스레드는 run() 메서드를 통해 동작한다. 따라서 스레드가 동작할 기능을 run() 메서드 안에 작성해야 하며, run() 메서드는 클래스 안에 작성해야 한다.

 

하지만, 스레드를 클래스에 정의하여 사용해야만 하는 것은 아니다. 익명 객체를 활용하여 스레드를 생성하고 실행시킬 수 있다.

 

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

public class ThreadEx2 {
    public static void main(String[] args) {
        // Runnable 익명 구현 객체 생성
        Thread thread1 = new Thread(new Runnable() {
            @Override
            // 생성된 스레드가 수행할 run() 메서드
            public void run() {
                for (int i =0; i <= 100; i++) {
                    System.out.println("ThreadTask");
                }
            }
        });
        thread1.start();

        // 메인 스레드가 작업할 반복문
        for (int i = 0; i <= 100; i++) {
            System.out.println("MainThread");
        }
    }
}

 

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

public class ThreadEx2 {
    public static void main(String[] args) {
        // Thread의 익명 하위 객체 생성
        Thread thread2 = new Thread() {
            // 생성된 스레드가 수행할 run() 메서드
            public void run() {
                for (int i = 0; i <= 100; i++) {
                    System.out.println("ThreadTask");
                }
            }
        };
        thread2.start();

        // 메인 스레드가 작업할 반복문
        for (int i = 0; i <= 100; i++) {
            System.out.println("MainThread");
        }
    }
}
반응형