개발일지/Java

Java 스레드 (Thread)

E-room 2022. 9. 24. 20:47
728x90

애플리케이션을 실행하면 운영체제로부터 실행에 필요한 만큼의 메모리를 할당받아 프로세스가 된다

 

프로세스는 데이터, 컴퓨터 자원, 그리고 스레드로 구성된다

 

스레드는 데이터와 애플리케이션이 확보한 자원을 활용하여 소스 코드를 실행한다

 

스레드는 하나의 코드 실행 흐름이다

 

메인 스레드 (Main thread)

자바 앱을 실행하면 가장 먼저 실행되는 메서드는 main이다.

메인 스레드가 main 메서드를 실행시켜준다

싱글 스레드 애플리케이션

 

멀티 스레드 (Multi-Thread)

하나의 프로세스는 여러 개의 스레드를 가질 수 있다

여러개의 스레드를 가진다는 것은 여러 스레드가 동시에 작업을 수행할 수 있음을 의미한다

멀티 태스킹을 구현하는데 핵심적인 역할을 한다

멀티 스레드 애플리케이션


작업 스레드 생성과 실행

별도의 작업 스레드를 활용하려면 작업 스레드가 수행할 코드를 작성하고, 작업 스레드를 생성하여 실행시켜야 한다

 

run()이라는 메서드 내에 스레드가 처리할 작업을 작성해야 한다

 

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

 

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

 

    1. Runnable 인터페이스를 활용

public class Main {
    public static void main(String[] args) {
        Runnable task1 = new ThreadTask1();
        Thread thread1 = new Thread(task1);

        thread1.start();

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

class ThreadTask1 implements Runnable {
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.print("#");
        }
    }
}
// 출력 예시
@@@@@@@###########@#@########@############@@@#@@@@@@@# ...

 

2. Thread 클래스를 활용

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

        ThreadTask2 thread2 = new ThreadTask2();

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

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

class ThreadTask2 extends Thread {
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.print("#");
        }
    }
}
// 출력 예시
########@@@@@@@@@@@#@########@@@@@@@@@@@#########@@@@@@ ...

익명 객체 사용

 

Runnable 익명 구현

public class Main {
    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();

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

 

Thread 익명 하위 객체 활용

public class Main {
    public static void main(String[] args) {
        // 익명 Thread 하위 객체를 활용한 스레드 생성
        Thread thread2 = new Thread() {
            public void run() {
                for (int i = 0; i < 100; i++) {
                    System.out.print("#");
                }
            }
        };
        thread2.start();
        for (int i = 0; i < 100; i++) {
            System.out.print("@");
        }
    }
}
728x90