개발지/Today I learn

[0905] 자바 스레드 (스레드의 생성/실행, 스레드의 이름)

개발지의 개발자 2023. 9. 5. 16:33

#스레드

- 프로세스와 스레드

  ▪ 프로세스 : 실행 중인 애플리케이션. 실행에 필요한 만큼의 메모리를 할당받음.

  ▪ 프로세스의 구성 : 데이터, 컴퓨터 자원, 스레드로 구성됨 

  ▪ 스레드 : 스레드는 데이터와 애플리케이션이 확보한 자원을 활용하여 소스 코드를 실행함. 즉 코드 실행 흐름과 같음

 

- 메인 스레드

  ▪ 메인 스레드는 자바 실행 시 가장 먼저 실행되는 main 메서드를 실행시킨다.

  ▪ main 메서드의 코드의 끝을 만나거나 return문을 만나면 실행을 종료한다.

  ▪ 소스 코드가 싱글 스레드라면 프로세스는 실행 중 하나의 스레드만 작동시키는 싱글 스레드 프로세스가 된다.

 

- 멀티 스레드

  ▪ 멀티 스레드 프로세스여러 개의 스레드를 가진 프로세스를 말한다.

  ▪ 여러 스레드가 동시에 작업을 수행하고 있는 것을 멀티 스레딩이라고 한다.

 

- 작업 스레드 생성과 실행

  ▪ 작업 스레드란, 메인 스레드 외에 별도의 스레드를 생성하여 코드를 실행시키는 것을 말한다.

  ▪ 클래스 내부에 run() 메서드를 활용하여 스레드가 처리할 작업을 작성한다.

  (1) Runnable 인터페이스를 구현한 객체에서 run()을 구현

public class ThreadExample1 {
    publicc static void main(String[] args {
    
        // Runnable 인터페이스 구현한 객체 
        Runnalbe task1 = new ThreadTask1();
        
        // Runnable 구현 객체를 인자로 전달하여 Thread 클래스 인스턴스화 하여 스레드 생성
        Thread thread1 = new Thread(task1);
        
        // 위 과정을 축약한 코드: Thread thread1 = new Thread(new ThreadTask1());
        
        // 작업 스레드 실행, run() 내부 코드 처리
        thread1.start();
    }
}

// Runnable 인터페이스 구현 클래스
class ThreadTask1 implements Runnalbe {
    public void run() {
        for (int i=0; i<100; i++) {
            System.out.print("#");
        }
    }
}

  (2) Thread 클래스를 상속받은 하위 클래스에서 run()을 구현

public class ThreadExample2 {
    public static void main(String[] args) {
        
        // Thread 클래스를 상속받은 클래스 인스턴스화, 스레드 생성
        ThreadTask2 thread2 = new ThreadTask2();
        
        // 작업 스레드 실행, run() 내부 코드 처리
        thread2.start();
    }
}

// (1)의 코드와 다른 점은 Thread 클래스를 직접 인스턴스화하지 않는다는 점이다.

class ThreadTask2 extedns Thread {
    public void run() {
        for (int i=0; i < 10; i++) {
            System.out.print("*");
    }
}

  (3) 익명 구현/하위객체를 활용한 스레드 생성 및 실행

public class ThreadExample3 {
    public static void main(String[] args) {
				
        // 익명 Runnable 구현 객체를 활용, 스레드 생성
        Thread thread1 = new Thread(new Runnable() {
            public void run() {
                for (int i=0; i<10; i++) {
                    System.out.print("*");
                }
            }
        });

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

 

- 스레드의 이름

  ▪ 메인스레드의 이름은 "main"이다.

  ▪ 그 외 추가 생성된 스레드는 기본적으로 "Thread-n" 이름을 가진다.

  ▪ 스레드의 이름을 조회하는 방법

public class ThreadName {
    public static void main(String[] args) {
    
        Thread thread1 = new Thread(new Runnable() {
            public void run() {
                System.out.println("My Thread Name");
            }
        });
        
        thread1.start();
        
        System.out.println(thread1.getName());
    }
}

// 출력값
My Thread Name
Thread-0

  ▪ 스레드의 이름을 설정하는 방법

public class ThreadName {
    public static void main(String[] args) {
    
        Thread thread1 = new Thread(new Runnable() {
            public void run() {
                System.out.println("Set My Thread Name");
            }
        });
        
        thread1.start();
        
        System.out.println(thread1.getName());
        
        thread1.setName("My Lime Thread");
        
        System.out.println(thread1.getName());
    }
}

// 출력값
Set My Thread Name
Thread-0
My Lime Thread

  ▪ 스레드 인스턴스의 주소값을 얻는 방법

-> 실행 중인 스레드의 주소값을 사용해야 하는 경우 Thread 클래스의 정적 메서드 currentThread()를 사용한다.

public class ThreadName {
    public static void main(String[] args) {
    
        Thread thread1 = new Thread(new Runnable() {
            public void run() {
                System.out.println(Thread.currentThread().getName());
            }
        });
        
        thread1.start();
        
        System.out.println(Thread.currentThread().getName());
    }
}
// 출력값
Thread-0