프로세스와 스레드
- 프로그램 : 실행 가능한 파일
- 프로세스 : 실행 중인 프로그램(메모리)
- 스레드 : 프로세스 내에서 실제 작업을 수행하는 주체
모든 프로세스에는 하나 이상의 스레드가 존재함
- 멀티 스레드 : 하나의 프로세스 내에서 둘 이상의 스레드가 동시에 작업을 수행하는 것을 의미함
멀티 프로세스와 멀티 스레드의 차이점
- 멀티 프로세스 : 각 프로세스가 독립적인 메모리를 가지고 별도로 실행됨
- 멀티 스레드 : 각 스레드가 자신이 속한 프로세스의 메모리를 공유함
멀티 스레드의 장점
- 자원을 보다 효율적으로 사용할 수 있다. ( => 시스템 자원의 낭비가 적음)
- 사용자에 대한 응답성이 향상된다.
- 작업이 분리되어 코드가 간결해진다.
멀티 스레드의 단점
- 동기화에 주의해야 한다.
- 교착상태가 발생하지 않도록 주의해야 한다.
- 각 스레드가 효율적으로 고르게 실행될 수 있게 해야 한다.
스레드를 구현하는 방법
1. Thread 클래스를 상속
2. Runnable 인터페이스를 구현
(실습)
싱글 스레드 프로그램
실행 결과
********************************************************************************************************************************************************************************************************
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
멀티 스레드 프로그램
방법 1.
Thread 클래스를 상속한 class를 작성한 후 이 class의 인스턴스를
생성한 후 이 인스턴스의 start() 메소드를 호출하여 실행한다.
방법 2.
Runnable 인터페이스를 구현한 class를 작성한 후 이 class의 인스턴스를
생성한 후 Thread 객체를 생성할 때 Thread 객체의 생성자에 넣어 생성한 후
이 Thread 객체의 start() 메소드를 호출하여 실행한다.
두 가지 방법을 제공하는 이유
- 방법 1만 제공한다면 자바에서는 다중 상속을 지원하지 않기 때문에
스레드 이외의 다른 클래스를 상속받을 수 없다.
- 인터페이스는 한 번에 여러 인터페이스를 구현할 수 있다.
실행 결과
*$$*$**$$**$$*$*$*$*$*$**$$*$**$$**$*$$*$**$$*$**$$*$**$$*$*$*$**$$*$**$*$*$*$*$$*$*$**$$*$*$**$*$$**$$*$*$**$$**$$*$*$**$$*$*$**$$**$*$$**$*$*$$*$**$$**$$*$*$**$$**$*$$**$$**$*$$*$**$*$$*$*$*$*$*$*$*$**$$*$*$*$**$$**$$**$$**$$*$*$**$$**$*$$**$$**$*$*$$*$**$$*$*$*$**$$*$**$*$$**$$*$**$$*$**$$*$*$**$*$*$$*$*$*$**$$*$*$*$*$*$**$*$$**$$**$$**$*$$*$**$*$$**$$**$$**$$*$*$**$$*$**$*$$*$*$*$*$*$*$*$*$*$*
방법 3. 익명 구현체
실행 결과
*$@*@$*$@*$@@*$$*@@$**$@$@*$@*@*$$@**@$$@*$@*$@*@$**@$$*@*@$*@$$*@*$@@*$$*@$*@@$*$*@@*$*$@@*$$@**@$$*@*$@@$*$*@*$@*$@*$@@*$$@**@$*@$@*$$*@*$@*$@@$**$@$@**$@*$@*@$@*$*$@$@**$@$@**$@@$*$*@@$*$@**$@@*$*$@$*@$@*$@**@$$*@*$@*$@*@$@$*@*$*@$@*$@$*@$*@*$*$@$@**$@@*$*@$*$@@$*$@*@$*@*$@*$$*@$*@@$**@$@*$*@$@*$*$@$*@$*@@*$@*$$@*@$*@$*@*$@*$@*$@*$@*$*@$@*$@*$$@**$@*@$@$*@$*@*$$@**@$$@*$*@@*$$@*@$*@$*@$*@$*@$*@$*@$*$@*$@*@$*$@*@$*@$*@$*@$*@$*$@*@$*$@*$@*@$*@$*$@*@$*$@*$@*@$*$@*@$*@$*@$*@$*@$*@$*@$*@$*@$*@$*@$*$@*@$*$@*@$*$@*$@*@$*@$*@$*$@*@$*@$*@$*$@*$@*@$*@$*@$*@$*$@*$@*@$*@$*$@*$@*@$*@$*@$*@$*$@*@$*$@*$@*
start() 메소드
- start() 메소드가 호출되면 새로운 Call Stack을 생성하여 run() 메소드를 호출한 뒤 종료된다.
- start() 메소드 대신 run() 메소드를 사용하면 새로운 Call Stack을 생성하지 않으며,
싱글 스레드를 사용한 것과 같은 결과가 나온다.
싱글 스레드 애플리케이션에서는 메인 스레드가 종료하면 프로세스도 종료되나,
멀티 스레드 애플리케이션에서는 실행 중인 스레드가 하나라도 있다면, 프로세스는 종료되지 않음
메인 스레드가 작업 스레드보다 먼저 종료되더라도 작업 스레드가 계속 실행중이라면 프로세스는 종료되지 않음
'JAVA' 카테고리의 다른 글
[JAVA] 데몬 스레드 (0) | 2021.07.30 |
---|---|
[JAVA] 하나의 스레드와 여러 개의 스레드가 수행되는 시간 비교하기 (0) | 2021.07.30 |
[JAVA] enum(열거형) (0) | 2021.07.29 |
[JAVA] 컬렉션 프레임워크 - Map (0) | 2021.07.27 |
[JAVA] equals() 메소드 , hashCode() 메소드 (0) | 2021.07.27 |