티스토리 뷰
728x90
반응형
Thread 클래스와 Runnable 인터페이스
Thread Class
- Thread 클래스를 상속받는 경우에는 run() 메서드를 오버라이딩해야합니다.
- Thread 클래스를 상속받아 사용하는 경우에는 정의된 각 스레드가 고유한 객체를 만들고 해당 객체와 연결이 됩니다.
Runnable Interface
- Runnable 인터페이스를 구현하는 경우에는 run() 메서드를 구현해야합니다.
- Runnable 인터페이스를 구현하는 경우 정의된 각 스레드는 같은 객체를 공유하게 됩니다.
Thread 흐름
Thread Class
- 위에서 설명한거처럼 고유한 객체를 만들고 해당 객체의 start() 메서드를 호출하여 스레드를 동작시킵니다.
- 여러개의 스레드가 필요한 경우 객체를 생성하여 스레드를 사용해야 합니다.
public class ThreadExample extends Thread{
private static final Random RANDOM = new Random();
@Override
public void run() {
String name = Thread.currentThread().getName();
System.out.println(name + " start");
int delay = 1000 + RANDOM.nextInt(4000);
try {
Thread.sleep(delay);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(name + " end (" + delay + "ms)");
}
}
public class Example {
public static void main(String[] args) {
System.out.println("메인 메서드 호출 시작");
// 스레드 객체 생성
ThreadExample firstThread = new ThreadExample();
firstThread.setName("first");
// 스레드 객체 생성
ThreadExample secondThread = new ThreadExample();
secondThread.setName("second");
firstThread.start();
secondThread.start();
System.out.println("메인 메서드 호출 종료");
}
}
Runnable Interface
- Thread 클래스를 상속받으면 스레드를 필요할 때마다 객체를 각각 생성해주어야합니다. 반면에 Runnable 인터페이스를 구현하게 된다면 하나의 객체를 공유하여 스레드 작업을 할 수 있습니다.
public class ThreadExample implements Runnable{
private static final Random RANDOM = new Random();
@Override
public void run() {
String name = Thread.currentThread().getName();
System.out.println(name + " start");
int delay = 1000 + RANDOM.nextInt(4000);
try {
Thread.sleep(delay);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(name + " end (" + delay + "ms)");
}
}
public class Example {
public static void main(String[] args) {
System.out.println("메인 메서드 호출 시작");
// 하나의 객체를 생성하여 자원 공유
ThreadExample thread = new ThreadExample();
Thread firstThread = new Thread(thread);
firstThread.setName("first");
Thread secondThread = new Thread(thread);
secondThread.setName("second");
firstThread.start();
secondThread.start();
System.out.println("메인 메서드 호출 종료");
}
}
Thread 클래스와 Runnable 인터페이스 차이
각각의 인스턴스를 사용하느냐! 하나의 인스턴스를 공유하느냐!
- Thread 클래스를 상속받아 사용하게 되면 스레드는 고유한 객체를 만들어 해당 객체와 연관시킵니다 (1 : 1)
- Runnable 인터페이스를 구현한다면 스레드는 하나의 인스턴스를 공유하여 스레드를 작동시킵니다. (1 : N)
메모리
- 위에서 Thread 클래스는 각각의 고유한 객체를 만들기 때문에 생성할 때마다 메모리를 잡아먹게되고 Runnable 인터페이스는 하나의 인스턴스를 공유하기 때문에 메모리가 적게 필요하게 됩니다.
다중 상속
- 자바에서는 다중 상속을 허용하지 않기 때문에 Thread 클래스를 상속받으면 다른 클래스를 상속받을 수 없습니다. 반면에 Runnable 인터페이스를 구현하게 된다면 다른 인터페이스 뿐만 아니라 다른 클래스도 상속 받을 수 있습니다. 따라서 해당 클래스의 확장성이 더 중요한 상황이라면 Runnable 인터페이스를 구현하는게 더 바람직할 것 입니다.
느슨한 결합
- Thrad 클래스를 상속받으면 Thread 클래스와 Thread 클래스의 작업이 동일한 클래스에 포함되므로 코드에서 밀접한 결합이 됩니다. 하지만 Runnable 인터페이스를 구현한 클래스는 스레드 코드가 스레드에 할당된 작업에서 분리되므로 코드에서 느슨한 결합을 가져옵니다.
728x90
반응형
'JAVA > JAVA기본' 카테고리의 다른 글
JAVA - Main Thread란(feat.동기화, 데드락)? (0) | 2022.01.27 |
---|---|
JAVA - Thread란? (0) | 2022.01.27 |
JAVA - 예외 처리(try, catch, throw, throws, finally) (0) | 2022.01.26 |
JAVA - 인터페이스란? (0) | 2022.01.26 |
JAVA - Object 클래스란? (0) | 2022.01.16 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- spring boot redis 대기열 구현
- service based architecture
- 공간 기반 아키텍처
- java userThread와 DaemonThread
- spring boot poi excel download
- spring boot excel download paging
- transactional outbox pattern
- pipeline architecture
- spring boot redisson sorted set
- polling publisher spring boot
- redis sorted set으로 대기열 구현
- 트랜잭셔널 아웃박스 패턴 스프링 부트 예제
- 레이어드 아키텍처란
- redis 대기열 구현
- 자바 백엔드 개발자 추천 도서
- spring boot redisson 분산락 구현
- @ControllerAdvice
- redis sorted set
- spring boot excel download oom
- 서비스 기반 아키텍처
- pipe and filter architecture
- 람다 표현식
- microkernel architecture
- spring boot redisson destributed lock
- java ThreadLocal
- spring boot 엑셀 다운로드
- 트랜잭셔널 아웃박스 패턴 스프링부트
- space based architecture
- JDK Dynamic Proxy와 CGLIB의 차이
- transactional outbox pattern spring boot
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
글 보관함