자바에서 스레드(thread)는 프로그램 내에서 실행되는 독립적인 실행 흐름입니다. 여러 스레드가 동시에 실행되면, 여러 작업을 병렬로 처리할 수 있습니다. 자바는 java.lang.Thread 클래스와 java.lang.Runnable 인터페이스를 통해 스레드를 지원합니다.
스레드 생성 방법
Thread 클래스 상속
class MyThread extends Thread {
public void run() {
// 스레드가 실행할 코드
}
}
Runnable 인터페이스 구현
class MyRunnable implements Runnable {
public void run() {
// 스레드가 실행할 코드
}
}
Thread 클래스를 상속받는 방식과 Runnable 인터페이스를 구현하는 방식은 둘 다 스레드를 생성하고 실행하는 기본적인 목적은 같지만, 몇 가지 중요한 차이점이 있습니다.
Java의 단일 상속 제약
Java는 단일 상속만을 지원하기 때문에, Thread 클래스를 상속받으면 다른 클래스를 상속받을 수 없습니다. 이는 클래스의 상속 구조에 제약을 줄 수 있습니다. 반면에 Runnable 인터페이스를 구현한다면, 다른 클래스를 자유롭게 상속받을 수 있으며, 여러 인터페이스와 함께 Runnable도 구현할 수 있습니다.
코드의 재사용성
Runnable 인터페이스를 구현한 클래스는 Runnable 객체를 생성하여 다른 스레드에 재사용할 수 있습니다. Thread 클래스를 상속받은 경우에는 이러한 재사용이 어렵습니다.
결합도
Runnable을 사용하면 스레드 로직을 클래스에서 분리할 수 있어, 객체 지향 설계 원칙에 더 부합하며 결합도가 낮아집니다. Thread 클래스를 상속받는 경우에는 스레드 로직이 클래스에 더 밀접하게 결합됩니다.
동기화
자바에서는 synchronized 키워드를 사용하여 여러 스레드가 동시에 접근할 수 있는 공유 자원에 대한 동기화를 할 수 있습니다.
synchronized(object) {
// 동기화 블록
}
또는 메서드에 synchronized 키워드를 추가할 수 있습니다.
public synchronized void myMethod() {
// 동기화 메서드
}