티스토리 뷰

반응형

1. Main Thread란

Java는 다중 스레드 프로그래밍 지원 기능이 내장되어있습니다. 다중 스레드 프로그램은 동시에 실행할 수 있는 두 개 이상의 스레드를 포함합니다. 각 스레드는 별도의 실행 경로를 정의합니다. Java 프로그램이 시작되면 하나의 스레드가 즉시 실행되기 시작합니다. 이것은 프로그램이 시작될 때 실행되는 스레드이기 때문에 일반적으로 프로그램의 메인 스레드(Main Thread)라고 합니다.

메인 스레드의 특성으로는

  • 이 스레드는 다른 "Child" 스레드를 생성 할 수 있습니다.
  • 다양한 종료 작업을 수행하기 때문에 실행을 완료하는 마지막 스레드여야 하는 경우가 많습니다.

흐름도(flow diagram)는 다음과 같습니다.

2. 메인 스레드를 제어하는 방법

메인 스레드는 프로그램이 시작될 때 자동으로 생성됩니다. 그것을 제어하기 위해 우리는 메인 스레드의 참조를 얻어야 합니다. 이것은 Thread 클래스에 있는 currentThread() 메서드를 호출하여 수행할 수 있습니다. 이 메서드는 호출된 스레드에 대한 참조를 반환합니다. 기본 스레드의 기본 우선 순위는 5이며 나머지 모든 사용자 스레드의 우선 순위는 상위에서 하위로 상속됩니다.

메인 스레드에서 생성한 자식 스레드가 우선 순위를 상속 받는 부분을 확인하는 예제

public class MainThreadMain extends Thread {

    public static void main(String[] args) {

        // 현재 스레드 정보를 가져옴
        Thread t = Thread.currentThread();

        // 현재 스레드는 Main Thread
        System.out.println("Current thread: "+ t.getName());

        // 메인 스레드의 이름을 변경함
        t.setName("Geeks");
        System.out.println("After name change: "+ t.getName());

        // Main 스레드의 우선 순위 값을 가져옴
        System.out.println("Main thread priority: "+ t.getPriority());

        // 우선순위를 가장 높게 설정
        t.setPriority(MAX_PRIORITY);

        // 변경된 우선 순위 확인
        System.out.println("Main thread new priority: "+ t.getPriority());

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

        // 메인 스레드에서 동작하는 자식 스레드를 생성
        Thread ct = new ChildThread();
        // 자식 스레드의 우선 순위를 가져옴
        // Main 스레드에 의해 생성됬으므로 Main 스레드의 우선 순위를 그대로 상속됩니다.
        System.out.println("Child thread priority: "+ ct.getPriority());

        // 자식 스레드의 우선 순위를 변경함. 자식의 우선 순위를 변경한다고 Main 스레드의 우선 순위가 변경되지는 않음
        ct.setPriority(MIN_PRIORITY);

        System.out.println("Child thread new priority: "+ ct.getPriority());

        // Starting child thread
        ct.start();
    }
}

class ChildThread extends Thread {
    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println("Child thread");
        }
    }
}
Current thread: main
After name change: Geeks
Main thread priority: 5
Main thread new priority: 10
Main thread
Main thread
Main thread
Main thread
Main thread
Child thread priority: 10
Child thread new priority: 1
Child thread
Child thread
Child thread
Child thread
Child thread

이제 Java에서 main() 메서드와 메인 스레드 간의 관계에 대해 논의해 보겠습니다. 각 프로그램에 대해 JVM(Java Virtual Machine)에 의해 Main 스레드가 생성됩니다. "Main" 스레드는 먼저 main() 메서드의 존재를 확인한 다음 클래스를 초기화합니다. 참고로 JDK 6부터 main() 메서드는 독립 실행형 Java 응용 프로그램에서 필수 메서드 입니다.

3. Main Thread 사용 시 교착 상태 확인(단일 스레드만)

메인 스레드를 사용하여, 즉 단일 스레드를 사용하여 교착 상태를 만들 수 있습니다.

public class DeadlockThreadMain {

    public static void main(String[] args) {
        try {
            System.out.println("Entering into Deadlock");
            
            Thread.currentThread().join();

            // join 메서드로 main 스레드가 종료 될때까지는 아해 메서드가 실행되지 않음
            System.out.println("This statement will never execute");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

Thread.currentThread().join() 문은 Main 스레드가 이 스레드(즉, 자체 대기)가 죽을 때까지 기다리라고 지시합니다. 따라서 메인 스레드는 자신이 죽을 때까지 기다립니다(Deadlock; 교착 상태).

 

 


 

반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함