본문 바로가기
🐎Language/Java

[Java] Thread와 MultiThread이란?

by inbeom 2023. 9. 24.
728x90
Java에서 Thread 클래스는 하나의 실행 흐름을 나타내는 것이다. 즉 하나의 프로그램이 여러 작업을 동시에 수행할 수 있게 해준다.

 

Thread 사용 분야

GUI 응용 프로그램:

UI업데이트와 동시에 백그라운드 작업 수행. (file down, data processing)

웹 서버:

각각의 클라이언트 요청을 별도의 스레드에서 처리하여 다중 사용자 지원.

게임 프로그래밍:

게임에서는 화면 업데이트, AI계산, 사운드 처리 등의 작업을 별도의 스레드에서 병렬로 처리해야 부드러운 동작을 유지할 수 있다.

네트워크 프로그래밍:

여러 클라이언트와 서버 간의 동시 통신을 처리해야 한다.

데이터베이스 작업:

데이터 연산 시간이 오래 걸릴 경우 별도의 스레드에서 처리 가능.

자연어 처리:

대용량 텍스트 데이터를 처리하는 경우 병렬 처리 필요.

실시간 시스템:

정확한 시간 내에 작업을 수행해야 하기 때문에 별도의 스레드 사용.

 

# Thread

Thread 생성에는 2가지 방법이 있다.

1. Thread 클래스 상속

Thread 클래스를 상속받아 run() 메서드를 오버라이딩하고, 해당 클래스의 객체를 생성하여 start() 메서드를 호출하여 실행한다.

class MyThread extends Thread {
    public void run() {
        System.out.println("스레드가 실행됨.");
    }
}

public class Main {
    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        myThread.start();
    }
}

 

2. Runnable 인터페이스 구현

Runnable 인터페이스를 구현하고, 해당 클래스의 객체를 Thread 클래스의 생성자에 넘겨서 스레드를 생성한다.

class MyRunnable implements Runnable {
    public void run() {
        System.out.println("스레드가 실행됨.");
    }
}

public class Main {
    public static void main(String[] args) {
        Thread myThread = new Thread(new MyRunnable());
        myThread.start();
    }
}

 


# Multi Thread

멀티 스레딩은 하나의 프로그램이 여러 스레드를 동시에 실행하여 병렬적으로 작업을 처리하는 것으로, CPU의 멀티코어를 활용하여 프로그램 성능을 향상시키는데 사용된다.

 

장점

성능 향상:

- 여러 작업을 동시에 수행하여 시스템의 성능을 최대로 활용한다.

반응성 향상:

- UI를 업데이트 하거나 사용자 입력을 처리하면서 동시에 백그라운드 작업을 수행할 수 있다.

자원 공유:

- 여러 스레드가 공유 자원에 접근할 때, 동시 접근 문제를 해결하면서 작업을 수행할 수 있다. 

 

주의사항

동기화 (Synchronization):

- 여러 스레드가 공유 자원에 접근할 때, 동시에 접근할 경우 문제가 발생할 수 있다. (이를 방지하기 위해 동기화 메커니즘 사용)

데드락 (Deadlock):

- 두 개 이상의 스레드가 서로 상대방의 작업이 끝날 때까지 기다리는 상황을 데드락이라고 한다. (이를 방지하기 위해 스레드 간의 자원 접근 순서를 조절해야 함)

쓰레드 안전성 (Thread Safety):

- 여러 스레드가 동시에 접근할 때도 정상적으로 동작하도록 코드를 작성해야 한다.

 

Example >

public class MultiThreadingExample {

    public static void main(String[] args) {
        // Thread 클래스를 상속받는 방법
        Thread thread1 = new MyThread("Thread 1");
        thread1.start();

        // Runnable 인터페이스를 구현하는 방법
        Thread thread2 = new Thread(new MyRunnable("Thread 2"));
        thread2.start();
    }

    static class MyThread extends Thread {
        private String name;

        public MyThread(String name) {
            this.name = name;
        }

        @Override
        public void run() {
            for (int i = 1; i <= 5; i++) {
                System.out.println(name + ": " + i);
                try {
                    sleep(1000); // 1초간 대기
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    static class MyRunnable implements Runnable {
        private String name;

        public MyRunnable(String name) {
            this.name = name;
        }

        @Override
        public void run() {
            for (int i = 1; i <= 5; i++) {
                System.out.println(name + ": " + i);
                try {
                    Thread.sleep(1000); // 1초간 대기
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

 

쓰레드 생명주기 (Thread LifeCycle)

 

 

 

728x90

'🐎Language > Java' 카테고리의 다른 글

JAVA ver.8  (1) 2023.11.10
[Java] Quartz 스케줄러  (0) 2023.09.24
[Java] Gson이란?  (0) 2023.09.24
[Java] JVM - JRE - JDK  (0) 2023.09.17
[Java] Optional 클래스  (0) 2023.09.11