반응형
쓰레드(Thread): 개념과 활용
쓰레드(Thread)는 프로그램 내에서 독립적으로 실행되는 작업 단위입니다. 자바는 멀티쓰레드 프로그래밍을 지원하여 애플리케이션의 성능과 효율성을 극대화할 수 있습니다. 이 글에서는 쓰레드의 개념, 자바에서 쓰레드를 다루는 방법, 그리고 다양한 활용 예시를 소개합니다.
쓰레드(Thread)란?
**쓰레드(Thread)**는 프로세스 내에서 실행되는 가벼운 작업 단위입니다. 하나의 프로세스는 여러 쓰레드를 가질 수 있으며, 각 쓰레드는 독립적으로 실행됩니다. 자바에서 쓰레드는 멀티태스킹을 구현하거나 병렬 처리를 수행할 때 유용합니다.
쓰레드의 특징:
- 독립 실행: 각 쓰레드는 별도로 실행되며, 다른 쓰레드와 자원을 공유할 수 있음.
- 병렬 처리: 여러 작업을 동시에 처리하여 효율성 향상.
- 자원 공유: 메모리와 같은 자원을 공유하므로 동기화가 필요.
자바에서 쓰레드 다루기
자바에서 쓰레드를 생성하고 실행하는 방법은 크게 두 가지가 있습니다:
- Thread 클래스 상속
- Runnable 인터페이스 구현
예제 1: Thread 클래스 상속
class MyThread extends Thread {
@Override
public void run() {
for (int i = 1; i <= 5; i++) {
System.out.println(Thread.currentThread().getName() + " - Count: " + i);
}
}
}
public class ThreadExample1 {
public static void main(String[] args) {
MyThread thread1 = new MyThread();
MyThread thread2 = new MyThread();
thread1.start();
thread2.start();
}
}
출력 결과 (순서 불확정):
Thread-0 - Count: 1
Thread-1 - Count: 1
...
예제 2: Runnable 인터페이스 구현
class MyRunnable implements Runnable {
@Override
public void run() {
for (int i = 1; i <= 5; i++) {
System.out.println(Thread.currentThread().getName() + " - Count: " + i);
}
}
}
public class ThreadExample2 {
public static void main(String[] args) {
Thread thread1 = new Thread(new MyRunnable());
Thread thread2 = new Thread(new MyRunnable());
thread1.start();
thread2.start();
}
}
출력 결과 (순서 불확정):
Thread-0 - Count: 1
Thread-1 - Count: 1
...
쓰레드 동기화
쓰레드가 공유 자원에 접근할 때는 동기화가 필요합니다. 자바는 synchronized
키워드를 제공하여 쓰레드 간의 자원 충돌을 방지합니다.
예제 3: 동기화
class SharedResource {
public synchronized void printNumbers(String threadName) {
for (int i = 1; i <= 5; i++) {
System.out.println(threadName + " - Number: " + i);
try {
Thread.sleep(100); // 0.1초 대기
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class Worker implements Runnable {
private SharedResource resource;
public Worker(SharedResource resource) {
this.resource = resource;
}
@Override
public void run() {
resource.printNumbers(Thread.currentThread().getName());
}
}
public class SynchronizedExample {
public static void main(String[] args) {
SharedResource resource = new SharedResource();
Thread thread1 = new Thread(new Worker(resource));
Thread thread2 = new Thread(new Worker(resource));
thread1.start();
thread2.start();
}
}
출력 결과 (순서 보장):
Thread-0 - Number: 1
Thread-0 - Number: 2
...
Thread-1 - Number: 1
...
다양한 활용 예시
- 병렬 작업 처리:
- 데이터베이스 쿼리 실행, 파일 처리 등에서 병렬 작업 수행.
- UI 애니메이션:
- GUI 애플리케이션에서 애니메이션이나 타이머 구현.
- 멀티플레이어 게임:
- 각 플레이어의 작업을 독립적으로 처리.
- 서버 클라이언트 통신:
- 각 클라이언트 요청을 독립적으로 처리.
예제: 간단한 타이머 구현
public class TimerExample {
public static void main(String[] args) {
Runnable timerTask = () -> {
for (int i = 10; i >= 1; i--) {
System.out.println("Countdown: " + i);
try {
Thread.sleep(1000); // 1초 대기
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("Time's up!");
};
Thread timerThread = new Thread(timerTask);
timerThread.start();
}
}
출력 결과:
Countdown: 10
Countdown: 9
...
Time's up!
마치며
자바 쓰레드는 멀티태스킹과 병렬 처리를 구현하는 데 매우 유용한 도구입니다. 쓰레드의 생성, 실행, 동기화, 다양한 활용 사례를 익히고 적절히 활용하여 효율적인 프로그램을 작성해 보세요!
반응형
'개발 부트캠프 > 백엔드' 카테고리의 다른 글
[Java] SOLID 원칙 (0) | 2025.01.07 |
---|---|
[Java] JDBC (Java Database Connectivity) (0) | 2025.01.07 |
[Java] Collection(List / Set / Map) (0) | 2025.01.06 |
[Java] 의존성 역전 원칙(DIP) (0) | 2025.01.04 |
[Java] 예외 처리 (Exception Handling) (0) | 2025.01.04 |