본문 바로가기

Programming Practice/Java

multi thread

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