Thread 과 run

moon.kick·2025년 3월 6일
1

package ex0306;

public class ThreadExam { //메인 넘버2개 알파1개
		
		public static void main(String[] args) {
			
		System.out.println("----------------------메인시작---------------------------");
		
		NumberThread th1 = new NumberThread("첫찌쓰렏");
		NumberThread th2 = new NumberThread("두찌쓰렏");
		
		Thread th3 =new Thread(new AlphaThread(),"세찌쓰렏");

		//들쭉날쭉
		th1.start();
		th2.start();
		
		th3.start();
		
		//런직접실행시 1일 다하고~2가 일다하고~
		//th1.run();
		//th2.run();
		//th3.run();
			
		
		System.out.println("----------------------메인끝---------------------------");
					
		}
}

////////////////////////////////////////////////////////////상속과 구현
class NumberThread extends Thread{
	NumberThread(String name){
		super(name); //스레드 이름설정
		
	}
	
	@Override
	public void run() {
		//현재동작스레드 누구?
		for(int i=1 ; i<=10 ; i++) {
			System.out.println(super.getName()+" =====> "+i);
		}
		System.out.println("-----------------------------------------------**");
		System.out.println(super.getName()+"   스레드종료..");
		System.out.println("-----------------------------------------------**");
	}
	
}
////////////////////////////////////////////////////////////상속과 구현
class AlphaThread implements Runnable{

	@Override
	public void run() {
		Thread th = Thread.currentThread();
		
		for(char ch='A' ; ch<='z'; ch++) {
			System.out.println(th.getName()+" ==> "+ch);
		}
		System.out.println("-----------------------------------------------//");
		System.out.println(th.getName()+"    스레드종료");
		System.out.println("-----------------------------------------------//");
	}
	
}

이 코드는 멀티스레딩을 이해하기 위한 예제입니다. 한 마디로, 여러 작업(스레드)을 동시에 실행하여 프로그램의 효율성을 높이는 개념을 보여줍니다. 아래에서 차근차근 설명해볼게요.


1. 메인 클래스 (ThreadExam)

  • 메인 시작과 종료 메시지 출력

    System.out.println("----------------------메인시작---------------------------");System.out.println("----------------------메인끝---------------------------");
    • 프로그램이 시작될 때와 끝날 때 콘솔에 메시지를 출력합니다.
  • 스레드 객체 생성

    NumberThread th1 = new NumberThread("첫찌쓰렏");
    NumberThread th2 = new NumberThread("두찌쓰렏");
    
    Thread th3 = new Thread(new AlphaThread(), "세찌쓰렏");
    • NumberThreadThread 클래스를 상속받아 만든 스레드입니다.
    • AlphaThreadRunnable 인터페이스를 구현하여 스레드로 실행할 수 있게 만든 클래스이며, 이를 Thread 객체로 감싸고 이름을 지정합니다.
  • 스레드 실행 (start() 메소드 사용)

    th1.start();
    th2.start();
    th3.start();
    • start() 메소드를 호출하면 각각의 스레드가 새로운 실행 흐름(쓰레드)에서 run() 메소드를 실행하게 됩니다.
    • 이로 인해 여러 스레드가 동시에 실행되며, 출력 순서는 실행 환경(스케줄러)에 따라 다르게 나타날 수 있습니다.
    • 주석 처리된 run() 호출은 단순히 메소드 호출일 뿐 새 스레드를 생성하지 않고 메인 스레드에서 순차적으로 실행됩니다.

2. NumberThread 클래스

  • Thread 상속 및 생성자
    class NumberThread extends Thread {
        NumberThread(String name) {
            super(name); // 스레드의 이름을 지정
        }}
    • Thread 클래스를 상속받아, 생성자에서 부모의 생성자를 호출하여 스레드 이름을 설정합니다.
  • run() 메소드 구현
    @Override
    public void run() {
        for (int i = 1; i <= 10; i++) {
            System.out.println(super.getName() + " =====> " + i);
        }
        System.out.println("-----------------------------------------------**");
        System.out.println(super.getName() + "   스레드종료..");
        System.out.println("-----------------------------------------------**");
    }
    • run() 메소드 내에서 1부터 10까지 숫자를 반복하며, 스레드 이름과 함께 출력합니다.
    • 반복이 끝나면 스레드 종료 메시지를 출력합니다.

3. AlphaThread 클래스

  • Runnable 인터페이스 구현
    class AlphaThread implements Runnable {
        @Override
        public void run() {
            Thread th = Thread.currentThread();
            for (char ch = 'A'; ch <= 'z'; ch++) {
                System.out.println(th.getName() + " ==> " + ch);
            }
            System.out.println("-----------------------------------------------//");
            System.out.println(th.getName() + "    스레드종료");
            System.out.println("-----------------------------------------------//");
        }
    }
    • Runnable 인터페이스를 구현하여 run() 메소드를 정의합니다.
    • 현재 실행 중인 스레드를 Thread.currentThread()를 통해 참조한 후, 문자 'A'부터 'z'까지(대문자, 일부 특수문자, 소문자까지 포함) 순차적으로 출력합니다.
    • 마지막에 스레드 종료 메시지를 출력합니다.

4. start()와 run()의 차이

  • start() 메소드 사용

    • start()는 새로운 스레드를 생성하고 그 스레드가 독립적으로 run() 메소드를 실행하도록 합니다.
    • 여러 스레드가 동시에 실행되므로 출력 결과가 섞여 나올 수 있습니다.
  • run() 메소드 직접 호출 (주석 처리된 코드)

    • run()을 직접 호출하면, 별도의 스레드를 생성하지 않고 현재 스레드(여기서는 메인 스레드)에서 순차적으로 실행됩니다.
    • 이 경우 멀티스레딩의 효과를 볼 수 없습니다.

5. 실행 결과

  • 메인 스레드는 프로그램 시작과 종료 메시지를 빠르게 출력합니다.
  • NumberThread (첫찌쓰렏, 두찌쓰렏)는 각각 1부터 10까지의 숫자를 출력하며 자신의 이름과 함께 진행 상황을 표시합니다.
  • AlphaThread (세찌쓰렏)는 알파벳과 그 사이의 문자를 차례대로 출력합니다.
  • 출력 순서는 스케줄러에 따라 달라지기 때문에 실행할 때마다 순서가 다르게 나타날 수 있습니다.

이와 같이 이 예제 코드는 스레드 생성, 스레드 실행, 그리고 스레드 간 동시 실행에 대한 기본적인 이해를 돕기 위한 구조로 작성되어 있습니다.

profile
@mgkick

0개의 댓글