1. multi thread 란?
1) 하나의 processor 가 여러개의 task를 함께 수행하는 것. 엄밀히 말해 동시에 수행하는 것은 아니다.
2) 여러개의 task에 대해 개별로 thread를 만들고, start를 시켜 수행한다.
3) thread가 생길 때마다 call stack이 따로 생기며, process 는 JVM 의 thread scheduler 의 결정에 따라 stack 들 사이를 옮겨다니며(move back and forth between stacks), task들을 함께 수행한다. (thread 실행 상태를 사용자가 설정할 수 없음)
2. thread 사용 방법
1) thread 실행 code를 담을 class 작성
- Runnable 이라는 interface 를 implement 해야 한다.
- 실행 code 는 public void run() {} 에 작성한다.
2) 해당 class의 객체 생성
3) thread 객체 생성
- Thread th = new Thread(생성된 객체);
4) thread 시작 선언
- thread 의 start method 호출 시
- th.start();
3. thread 상태
상태 |
상태 설명 | 언제 해당 상태가 되는지? |
runnable |
실제 실행이 되기 위한 준비 상태 | thread 의 start method 호출 시 * start method 호출 시 running 이 아닌 runnable 상태가 된다는 것이 중요함! |
running |
실제 실행 | JVM thread scheduler 가 실행시키기로 결정했을 때 (runnable 상태의 thread 들의 call stack 들 중 하나를 실행시키기로 결정했을 때) * thread 간에 실행 순서를 주는 것은 불가능하다. |
blocked |
실제 실행 방지 | thread 실행 code 를 담을 class 에서 Thread.sleep(miliseconds) method 호출 시 ex. try { Thread.sleep(2000); } catch(InterruptedException ex) { ex.printstack(); } - miliseconds 동안 running 상태가 되는 것을 방지 - thread 실행을 좀더 예측가능하도록 설정 (more predictable) |
4. lock
- object 에 lock 을 주는 것.
- A 라는 thread Z 라는 method를 통해 object에 접근했을 때 object 에 lock을 걸고, lock을 풀 수 있는 key를 가져온다. A thread Z method 실행을 완료했을 때, object 의 key를 열 수 있는 lock을 돌려준다. 만약 A thread Z method를 수행하다가 runnable 상태가 된다면, A thread 에서는 object 에 대한 key를 계속 가지고 있다. 따라서 B thread 의 Z method는 object에 접근할 수 있는 key 가 없기 때문에 A thread 가 다시 running 상태가 되서 Z method를 완료하고, object에 대한 key를 돌려줄 때까지 object에 접근할 수 없다.
- 이렇게 하는 방법은 위의 Z 라는 method를 선언할 때 앞에 synchronized를 붙여주는 것이다.
ex) public synchronized void increment() {}
* 항상 synchronized를 붙여줘야 하는가? - No! 꼭 필요할 때만 사용
이유)
ㄱ. overhead - 항상 object에 접근할 수 있는 key를 찾는 작업이 덧붙여진다.
ㄴ. slow - 여러 개의 thread 가 하나의 object에 접근하려고 할 때 한개를 제외한 나머지 thread 들은 모두 runnable 상태에서 대기를 해야 한다.
ㄷ. deadlock - java 에서는 application/database server 와 달리 (수행시간이 특정 시간을 넘어가면, transaction rollback을 시킴) 자체 해결책이 없다. 따라서 thread 수행 order design을 통해 프로그래머 스스로 해결해야 한다.
5. thread safe
- 여러개의 thread 가 수행되어도 안전하다.
'Programming Practice > Java' 카테고리의 다른 글
parameter로 객체 정보를 받아서 객체 생성 (0) | 2015.01.17 |
---|---|
FileFilter (0) | 2015.01.12 |
자바 로직 성능 측정 (0) | 2014.11.24 |
Data Collection sort (0) | 2014.11.12 |
특정 폴더의 파일 목록 가져오기 (0) | 2014.10.27 |