일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 파이썬 강좌
- Actor
- 파이썬 머신러닝
- play2 강좌
- 그라파나
- 안드로이드 웹뷰
- 플레이프레임워크
- play 강좌
- 파이썬 데이터분석
- 하이브리드앱
- Play2
- 스칼라 동시성
- 블록체인
- 스칼라
- akka 강좌
- 엔터프라이즈 블록체인
- 스위프트
- 파이썬 동시성
- 주키퍼
- Akka
- Play2 로 웹 개발
- Hyperledger fabric gossip protocol
- Golang
- hyperledger fabric
- 하이퍼레저 패브릭
- CORDA
- 스칼라 강좌
- 이더리움
- Adapter 패턴
- 파이썬
- Today
- Total
HAMA 블로그
자바 Concurrent 라이브러리 정리 본문
Executors 유틸리티 클래스를 이용하여 각종 쓰레드 풀 생성하기
ExecutorService = Executors.newFixedThreadPool(int nThreads)
최대 지정한 개수 만큼의 쓰레드를 가질 수 있는 쓰레드 풀을 생성한다. 실제 생성되는 객체는 ThreadPoolExecutor 객체이다.
항상 일정한 스레드 개수를 유지한다. 스레드가 유휴상태이더라도 제거하지 않고 유지한다.
다만 작업도중 비정상적으로 스레드가 종료하는 경우에는 스레드를 추가로 생성하며, nThreads 개수보다 1개가 더 생길 수
도 있다.
ScheduledExecutorService = Executors.newScheduledThreadPool(int corePoolSize)
지정한 개수만큼 쓰레드가 유지되는 스케줄 가능한 쓰레드 풀을 생성한다. 실제 생성되는 객체는
ScheduledThreadPoolExecutor 객체이다.
ExecutorService = Executors.newSingleThreadExecutor()
하나의 쓰레드만 사용하는 ExecutorService를 생성한다.
항상 1개의 스레드만 동작한다. 따라서 스레드가 동작중일 경우 나머지 작업은 모두 큐에서 대기하며, 순서대로 하나씩 실
행된다. 만약 비정상적으로 스레드가 종료되는 경우, 새로 스레드를 생성하고 남은 작업을 계속 한다.
ScheduledExecutorService = Executors. newSingleThreadScheduledExecutor()
하나의 쓰레드만 사용하는 ScheduledExecutorService를 생성한다.일정 시간 이후에 실행되거나 주기적으로 작업을 실행할
수 있으며, 스레드의 수가 고정되어 있는 형태의 Executor.Timer 클래스의 기능과 유사하다
ExecutorService = Executors.newCachedThreadPool()
필요할 때 마다 쓰레드를 생성하는 쓰레드 풀을 생성한다. 이미 생성된 쓰레드의 경우 재사용된다.
실제 생성되는 객체는 ThreadPoolExecutor 객체이다. 스레드 개수에 제한이 없이 필요한 경우 계속 스레드 수가 증가한다.
다만 일정 시간(60초)동안 사용하지 않는(idle) 스레드는 종료된다.
필요없는 스레드를 제거하므로 서버 리소스(memory)는 적게 사용하지만, 스레드 생성과 삭제를 반복하므로 작업 부하가
불규칙적인 경우 비효율적이다.
(http://javacan.tistory.com/124 상세설명)
CopyOnWriteArrayList
CopyOnWrite 가 말해주는것처럼 read (select) 시는 아무런 동기화 문제가 없기때문에 놔두고
변경이 일어날경우 객체를 clone 해서 다루자는 전략입니다. 따라서 읽기행위가 많이 일어나는
곳에서 사용하기 좋습니다.
BlockingQueue
보통 생산자 - 소비자 패턴에서 활용되는 큐로 많이 사용된다. 사실 이야기는 이 큐는 멀티쓰레드환경에서
대표할만한 컬렉션이라는 것이다. 전에 Actor / Akka 문서에 말한 큐같은것들이 대부분 이것으로 이루어져있다.
소비자가 꺼내어 사용할동안 생산자는 멈춰있고, 생산자가 넣을동안 소비자는 멈춰있어야한다.
서로 쟁탈하면 선반은 망가질것이다.
ConcurrentHashMap
ConcurrentHashMap은 Map의 일부에만 Lock을 걸기때문에 HashTable과 synchronized Map 보다
효율적인게 특징이다.
Runnable : 결과값을 리턴하지 않는다 - void run()
Callable : 결과 값을 리턴한다. - V call()
Future : Callable의 리턴값은 실행시키지마자 얻을수있는게 아니라 미래에 얻게된다.
그 값을 받을수있는 인터페이스이다.
함수안의 로컬변수는 쓰레드 마다 고유하게 가질수있는것은 알것이다. 그럼 쓰레드마다 고유의 변수를 해당 함수의 안 뿐만아니라, 클래스의 정적멤버등으로 생성하여 각각의 쓰레드가 다른곳에서 사용하고싶을땐? 그때 이것을 사용할수있다.
CountDownLatch
모든쓰레드(테스크)가 종료되면 , 호출될 필요가 있는곳에 사용된다. 관련 쓰레드들의 이벤트들을 감지 하기위해
사용한다.
CyclicBarrier
CountDownLatch 와는 반대(?) 로 모든쓰레드가 종료가 아니라 블럭되면 , 호출될 필요가 있는곳에 사용된다.
다른 쓰레드를 기다리기위해 사용한다고 볼수있다.
하마(HAMA) 라는 분산머신러닝에 사용되는 오픈소스가 있는데, BSP 알고리즘을 사용하는데 BSP 란
각각의 컴퓨터가 일을 하고, 자신의 일이 끝나면 멈춰있게된다, 모든 컴퓨터들이 멈춰있게되면 ( 각각의 일을 끝마치면)
서로 커뮤니케이션하는 구조인데, 전체 컴퓨터들의 분산락을 걸어주는것과 비슷한것이다.
분산락은 Zookeeper 라는 오픈소스를 사용한다.
Exchanger
서로 다른 쓰레드에서 각각의 데이터 (컬렉션을 통채로도) 를 주고 받을수있게한다. 별로 쓸일 없어보인다.
FutureTask
모든쓰레드(테스크)가 종료되면 , 호출될 필요가 있는곳에 사용된다.
import java.util.Random; public class SemaphoreTest { private static final Random rd = new Random(10000); static class Log { class SemaphoreResource extends Semaphore { private static final long serialVersionUID = 1L; public SemaphoreResource(final int permits) { public void use() throws InterruptedException { acquire(); // 세마포어 리소스 확보 try { protected void doUse() throws InterruptedException { // 임의의 프로그램을 실행하는데 거리는 가상의 시간 /** something logic **/ } } class MyThread extends Thread { private final SemaphoreResource resource; public MyThread(String threadName, SemaphoreResource resource) { @Override } public static void main(String... s) { System.out.println("Test Start..."); for (int i = 0; i < 20; i++) { } } |
'Java' 카테고리의 다른 글
자바 enum 정리 (0) | 2015.09.01 |
---|---|
자바 volatile / C volatile 정리 (0) | 2015.09.01 |
자바 쓰레드 점유율 팁 ( 점유율을 공평하게 만들자) (0) | 2015.08.18 |
자바 쓰레드 테스트 (0) | 2015.08.18 |
자바 경로 (Path) 및 사용법 정리 (0) | 2015.08.12 |