자바 Thread(스레드) 사용법
1. 스레드 생성하기
자바에서 스레드를 사용하려면 Thread
클래스를 상속받아 새로운 클래스를 정의하거나, Runnable
인터페이스를 구현하여 클래스를 정의해야 합니다. 두 가지 방법의 차이는 단순히 상속과 구현에만 있을 뿐, 동작 방식은 동일합니다.
class MyThread extends Thread {
public void run() {
// 스레드 동작 코드
}
}
class MyRunnable implements Runnable {
public void run() {
// 스레드 동작 코드
}
}
2. 스레드 시작하기
스레드가 생성되면 start()
메소드를 호출하여 스레드를 시작할 수 있습니다. start()
메소드는 스레드를 실행하는 데 필요한 JVM의 내부 자원을 할당하고 run()
메소드를 실행시킵니다.
Thread myThread = new MyThread();
myThread.start();
3. 스레드 동작 제어하기
3-1. sleep()
sleep()
메소드는 스레드를 잠시 일시 정지시키는 역할을 합니다. 이를 통해 다른 스레드에게 실행 시간을 양보할 수 있습니다.
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// 예외 처리 코드
}
3-2. join()
join()
메소드는 특정 스레드의 종료를 기다리는 역할을 합니다. 즉, 다른 스레드가 종료될 때까지 현재 스레드는 대기합니다.
Thread myThread = new MyThread();
myThread.start();
try {
myThread.join();
} catch (InterruptedException e) {
// 예외 처리 코드
}
4. 스레드 우선순위 설정하기
스레드에는 우선순위를 설정할 수 있는데, 이를 통해 어떤 스레드가 CPU 자원을 우선적으로 점유할지 결정할 수 있습니다. 우선순위는 1에서 10까지의 값을 가지며, 기본값은 5입니다.
myThread.setPriority(7);
5. 스레드 상태 참조하기
스레드의 상태는 getState()
메소드를 사용하여 확인할 수 있습니다. 주요한 스레드 상태는 다음과 같습니다.
- NEW: 스레드가 생성되었지만 아직
start()
메소드가 호출되지 않음 - RUNNABLE: 실행 중인 스레드
- BLOCKED: 동기화 블록에 의해 일시 정지된 스레드
- WAITING:
wait()
메소드에 의해 일시 정지된 스레드 - TIMED_WAITING:
sleep()
이나join()
메소드에 의해 일시 정지된 스레드 - TERMINATED: 종료된 스레드
Thread.State state = myThread.getState();
자바 Thread 예제
1. 스레드를 활용한 숫자 출력
아래 예제는 스레드를 사용하여 1부터 10까지의 숫자를 출력하는 간단한 프로그램입니다.
class NumberPrinter implements Runnable {
private int start;
private int end;
public NumberPrinter(int start, int end) {
this.start = start;
this.end = end;
}
public void run() {
for (int i = start; i <= end; i++) {
System.out.println(i);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// 예외 처리 코드
}
}
}
}
public class Main {
public static void main(String[] args) {
Thread t1 = new Thread(new NumberPrinter(1, 5));
Thread t2 = new Thread(new NumberPrinter(6, 10));
t1.start();
t2.start();
}
}
2. 스레드 우선순위 설정하기
아래 예제는 스레드 우선순위를 설정하여 두 개의 스레드가 번갈아가며 실행되는 프로그램입니다.
class PrintThread implements Runnable {
private String message;
private Thread nextThread;
public PrintThread(String message) {
this.message = message;
}
public void setNextThread(Thread nextThread) {
this.nextThread = nextThread;
}
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println(message);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// 예외 처리 코드
}
Thread.yield();
nextThread.start();
try {
nextThread.join();
} catch (InterruptedException e) {
// 예외 처리 코드
}
}
}
}
public class Main {
public static void main(String[] args) {
Thread t1 = new Thread(new PrintThread("Hello"));
Thread t2 = new Thread(new PrintThread("World"));
t1.setPriority(Thread.MAX_PRIORITY);
t2.setPriority(Thread.MIN_PRIORITY);
t1.setNextThread(t2);
t2.setNextThread(t1);
t1.start();
}
}
마무리
이 포스팅에서는 자바에서 스레드를 사용하는 방법과 스레드의 예제를 소개했습니다. 스레드를 활용하면 동시에 여러 작업을 수행할 수 있으며, 운영체제의 자원을 효율적으로 활용할 수 있습니다. 다만, 스레드의 동기화와 관련된 문제에 주의해야 하며, 적절한 동기화를 통해 경쟁 상태나 데드락 등의 문제를 방지해야 합니다.
댓글