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();
}
}
}
}
}
'🐎Language > Java' 카테고리의 다른 글
[Java] MyBatis: ClassNotFoundException 트러블 슈팅 (JVM 네이밍 규칙) (2) | 2024.09.18 |
---|---|
[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 |