학습(구)/Java(구)

멀티스레드

잉아당 2021. 4. 5. 18:18
728x90

멀티스레드 

- 하나의 어플리케이션에 여러개의 스레드가 존재하는 것을 의미합니다.

- 프로세스 :1프로세스당 1어플레케이션을 의미합니다.

- 스레드 : 스택영역 안에 각각 생성하여 병렬로 처리하는데 사용하며 독립적인 실행됩니다.

 

스레드 객체 와 태스크 객체 

- 병렬처리 어플리케이션은 복수 개의 스레드를 생성한 후 각 스레드가 자신의 태스크를 수행하는 것입니다.

- 스레드 객체가 태스크 객체를 관리하며 태스크 객체는 작업 내용을 담고 있는 객체 입니다.

#병렬 처리 방식

- 동시성 : 하나의 코어에서 번갈아 가며 실행하는 것입니다.

- 병렬성 : 멀티코어에서 개별 스레드를 동시에 실행하는 것입니다.

 

Main 스레드 

- JVM이 자동으로 생성하는 스레드 이며 어플리케이션 수행은 main 스레드로부터 시작됩니다.

 

작업 스레드 생성과 실행

- Thread 클래스로부터 직접 생성 : Runnable 인터페이스를 반영한 구현 클래스로부터 생성된 객체를 생성자 매개 변수로 넘겨주면서 스레드 객체를 생성하는 방법입니다.

- Thread 상속 생성 : Thread 클래스를 상속 받은 후 run() 메서드를 재정의 하여 사용하는 방법입니다.

- 스레드 풀 사용 : 태스크 객체(Runnable, Callable)를 생성하여 스레드 풀 객체에게 작업 처리를 요청합니다.

 

동기화 메서드와 블록

- 서로 다른 스레드가 동시에 공유 자원을 사용하면 자원 사용에 문제가 발생할 수 있기 때문에 특정 스레드가 메서드의 단독 사용을 보장해야합니다.

- synchronized 예약어를 사용하여 동기화를 부여할 수 있습니다.

 

스레드 풀 사용

- 과도한 스레드 사용은 선능을 감소시키므로 스레드 풀을 사용해 일정 개수의 스레드를 생성해 가지고 있으면서 그 개수를 유지해야 합니다.

- 스레드 풀은 어플리케이션 초기에 Executors 클래스의 static 메서드를 사용해 스레드 풀 객체를 생성하며 종료시 shutdown() 메서드를 사용해 종료합니다.

- 스레드 풀의 작업 처리 요청은 submit()을 이용해 Future 객체를 반환합니다. 요청된 작업을 작업 큐에 대기시키고 순서대로 처리합니다.

처리 후 사용한 스레드는 다시 반납합니다.

- future 객체를 통해 결과를 돌려받기 위해선 get()메서드를 사용하는데 이때 블로킹 되어져 완료될때까지 기다려야 합니다.

- block 상태 필요없이 내 작업을 수행하고 싶을때는 콜백 방식을 이용하는데 태스크를 수행하는 run() 메서드 내부에서 CompletionHandler 객체를 사용해 결과를 통보 받을 수 있습니다.

'학습(구) > Java(구)' 카테고리의 다른 글

IO 스트림과 제너릭타입  (0) 2021.04.12
컬렉션과 컬렉션 스트림  (0) 2021.04.05
인터페이스와 람다  (0) 2021.03.30
어노테이션  (0) 2021.03.22
예외 처리  (0) 2021.03.22