1, 프로세스와 쓰레드
(1) 프로세스(Process)
: 프로세스란 간단히 말하자면 '실행 중인 프로그램(program)' 이다. 프로그램을 실행하면 OS로부터 실행에 필요한 자원(메모리)을 할당받아 프로세스가 된다.
- 프로세스 = 수행 시 필요한 데이터 + 메모리 등의 자원 + 쓰레드(실제로 작업을 수행하는 것)
: 모든 프로세스에는 최소한 하나 이상의 쓰레드가 존재하며, 둘 이상의 쓰레드를 가진 프로세스는 '멀티쓰레드 프로세스(multi-threaded process)'라고 함.
하나의 프로세스가 가질 수 있는 쓰레드의 갯수는 제한되어 있지 않으나 쓰레드를 수행하는데 개별적인 메모리 공간(호출 스택)을 필요로 하기 때문에 메모리 한계에 따라 생성할 수 있는 쓰레드의 수가 결정됨.
(2) 멀티태스킹과 멀티쓰레딩
- 멀티태스킹
: 현재 우리가 사용하고 있는 대부분의 OS는 멀티태스킹(multi-tasking, 다중작업)을 지원하기 떄문에 여러 개의 프로세스가 실행될 수 있음.
- 멀티쓰레딩
: 멀티태스킹과 같은 이치로 하나의 프로세스 안에서 여러 쓰레드가 동시에 작업을 수행하는 것.
CPU의 코어는 한 번에 단 하나의 작업만 수행할 수 있으므로 실제로 동시에 처리되는 작업의 갯수는 코어의 갯수와 일치함.
(?) 하나의 코어에서 어떻게 여러 개의 쓰레드가 수행되는 것일까?
: 각 코어가 아주 짧은 시간 동안 여러 작업을 번갈아 가며 수행함으로써 여러 작업들이 모두 동시에 수행되는 것처럼 보이게 함.
(3) 멀티쓰레딩의 장단점
- [장점] CPU의 사용률을 향상시킨다.
- [장점] 자원을 보다 효율적으로 사용할 수 있다.
- [장점] 사용자에 대한 응답성이 향상된다.
- [장점] 작업이 분리되어 코드가 간결해진다.
- [단점] 여러 쓰레드가 같은 프로세스 내에서 자원을 공유하면서 작업을 하기 떄문에 동기화(synchronization), 교착상태(deadlock, 두 쓰레드가 자원을 점유한 상태에서 서로 상대편이 점유한 자원을 사용하려고 기다리느라 진행이 멈춰있는 상태)와 같은 문제들을 고려해야 함.
2. 쓰레드의 구현과 실행
(1) 쓰레드 구현 방법 (2가지)
- Thread 클래스를 상속(extends)받는 방법 : JAVA에서는 여러 클래스를 상속 받을 수 없기 때문에 Thread 클래스만 상속받은 채로 프로그래밍 해야 함.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | class ThreadExample { public static void main(String[] args) { ThreadC tc = new ThreadC(); // thread start tc.start(); } } class ThreadC extends Thread { public void run() { // thread logic 구현.... } } | cs |
- Runnable 인터페이스를 구현(implements)하는 방법 : 다른 클래스를 상속 받을 수 있어 이 방법이 좀 더 일반적.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | class ThreadExample { public static void main(String[] args) { Runnable r = new ThreadR(); Thread tr = new Thread(r); // 위의 두줄과 같은 로직 // Thread tr = new Thread(new ThreadR()); // thread logic start tr.start(); } } class ThreadR implements Runnable { public void run() { // thread logic 구현.... } } | cs |
- 쓰레드의 실행 - start()
: 쓰레드를 생성했다고 해서 자동으로 실행이 되는 것이 아님. start()를 호출해야만 쓰레드가 실행됨.
근데 여기서 알아둬야 할 건 start()를 호출한다고 해서 또 바로 실행되는 것은 아니라는 것.
실행대기 상태에 있다가 자신의 차례가 되어야 실행되고 만약 실행 대기 중인 쓰레드가 하나도 없으면 바로 실행 상태가 됨.
그리고 한번 실행이 종료된 쓰레드는 다시 실행할 수 없다는 점도 알아둬야 함.
(start()를 2번 이상 호출하면 실행시에 IllegalThreadStateException이 발생함)
3. start() 와 run()
4. 싱글쓰레드와 멀티쓰레드
5. 쓰레드의 우선순위
'PROGRAMMING > JAVA' 카테고리의 다른 글
[ JAVA 정복 ] Thread(쓰레드) - 2 (0) | 2018.10.19 |
---|---|
[ JAVA 정복 ] java.lang 패키지와 유용한 클래스 (0) | 2018.10.08 |
'==' , compareTo(), equals() - 서로간의 차이점에 대해 알아보자 (0) | 2013.03.12 |
잠깐) 보수법 (2) | 2013.02.25 |
4. 상속(inheritance) (0) | 2013.02.25 |