● PROCESS : 실행중인 프로그램
------------------> 자원 + 공간(*) + 쓰레드(**) 로 이뤄짐.
* 자원 : 공간(호출스택)의 크기에 따라 호출할 수 있는 쓰레드의 수가 결정된다.
** 쓰레드 : 쓰레드의 갯수에 따라 싱글 쓰레드와 멀티 쓰레드로(***) 나뉜다.
*** < 멀티 쓰레드의 장점 >
1. cpu의 활용률 향상
2. 자원을 보다 효율적으로 사용
3. 사용자에 대한 응답성 향상
4. 작업이 분리 되기 때문에 코드가 간결해진다.
=> 쓰레드와 사용자 요청이 1:1 대응이 되도록 프로그래밍 해야 한다.
< 멀티 쓰레드의 단점 > --> 이 부분에 대해선 뒤에서 자세히 다루자.
1. 동기화 문제
2. 교착상태
=> 여러 쓰레드가 자원을 공유하면서 작업을 하기 때문에 발생.
cf> 프로세스의 성능이 쓰레드의 개수와 비례하진 않는다.
● 쓰레드 구현 방법
1. Thread 클래스 상속
-> But, Thread클래스를 상속받으면 다른 클래스를 상속 받을 수 없다.
2. Runnable 인터페이스 구현.
-> 이 방법을 주로
ex>
|
class MyThread implements Runable {
public void run() { /* 작업 내용 */ }
}
|
cs |
● 한번 사용한 쓰레드는 재 사용될 수 없다. (즉, 한번 start() 한 것을 또 start()할 수 없다.)
● 예시를 통해 호출스택 내부를 살펴보도록 하자.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 |
public class ThreadEx3 {
public static void main(String[] args) throws Exception {
MyThreadEx3_1 t1 = new MyThreadEx3_1();
t1.run();
}
}
class MyThreadEx3_1 extends Thread {
public void run() {
throwException();
}
public void throwException() {
try {
throw new Exception();
} catch (Exception e) {
e.printStackTrace();
}
}
}
|
cs |
실행결과
java.lang.Exception
at GodBell.MyThreadEx3_1.throwException(ThreadEx3.java:19)
at GodBell.MyThreadEx3_1.run(ThreadEx3.java:14)
at GodBell.ThreadEx3.main(ThreadEx3.java:7)
![](https://t1.daumcdn.net/cfile/tistory/99EBB84F5A360A9A28)
: 이 예제는 고의적으로 예외를 발생시켜서 호출스택의 내용을 확인할 수 있도록 했다.
(start() 메서드가 아니라 run()메서드 이기 때문에 main()메서드가 호출스택에 포함되어 있음을 확인할 수 있다.)
● start VS run
start() : 쓰레드 실행 (새로운 호출 스택 생성)
run() : 단순히 클래스에 속한 메서드 하나를 호출
cf> start()가 호출된 쓰레드는 바로 실행되는것이 아니고, 일단 대기상태에 있다가 스케줄러가 정한 순서에 의해 실행.
실행중인 쓰레드가 하나도 없을 때 program은 종료된다.
![](https://t1.daumcdn.net/cfile/tistory/998797475A360C7725)
● 싱글 쓰레드 VS 멀티 쓰레드
- cpu 만을 사용하는 계산 작업이라면 오히려 싱글 쓰레드가 더 빠르다.
why)) 스위칭 때문!! (다음에 실행하는 위치(PC)등의 정보를 저장하고 읽어오는 시간이 소요된다.)
- 프린트기 사용이나 다른 입력장치와 함께 사용할때에는 멀티쓰레드가 더 좋다.
● 쓰레드는 우선순위 속성을 가지고 있다.
- 우선순위 (1 ~ 10) : 클수록 우선순위가 높다.
- 절대적이 아니라 상대적인 개념.
ex> 1, 2 == 9, 10
(두 경우 모두 우선순위가 1차이 만큼 우선순위 속성을 가지고 있다.)
- main의 쓰레드의 우선순위는 '5'이므로 main 내의 생성한 쓰레드는 우선순위 '5'를 갖게된다.
● 쓰레드 그룹
- 그룹 : 폴더개념이라고 생각하자.
- 보안상의 이유로 만들어졌다. (자신이 속한 그룹이거나, 하위그룹 쓰레드는 변경 가능 하지만 다른 그룹의 쓰레드는 내용 변경 불가!)
- 모든 쓰레드는 그룹에 포함되어야 한다.
- ThreadGroup(String name)을 사용해서 그룹 생성 가능.
- 쓰레드 그룹에 포함시키려면 "생성자"를 이용해야 한다.
if> 생성자를 안썻다면?
: 자신을 생성한 쓰레드와 같은 그룹에 속하게 된다.
=> 즉, 우리가 생성한 모든 쓰레드는 모두 main 쓰레드 그룹에 속하게 된다.
~641 PAGE 부터 이어집니다.... (데몬 쓰레드 부터 시작)