사이트 로그인
2016.06.29 10:37
private GeneralThreadPool() {
if (Config.THREAD_P_TYPE_GENERAL == 1) {
_executor = Executors
.newFixedThreadPool(Config.THREAD_P_SIZE_GENERAL);
} else if (Config.THREAD_P_TYPE_GENERAL == 2) {
_executor = Executors.newCachedThreadPool();
} else {
_executor = null;
}
int i = 2 + Runtime.getRuntime().availableProcessors() * 4;
final int instantPoolSize = Math.max(1, i / 3);
_scheduler = Executors
.newScheduledThreadPool(SCHEDULED_CORE_POOL_SIZE,
new PriorityThreadFactory("GerenalSTPool",
Thread.NORM_PRIORITY));
_pcScheduler = Executors.newScheduledThreadPool(_pcSchedulerPoolSize,
new PriorityThreadFactory("PcMonitorSTPool",
Thread.NORM_PRIORITY));
}
현재 에바팩기준으로 다른누군가가 따로수정하지않았다면 우리 제너럴쓰레드풀 java의 소스는 이런상태입니다.
GeneralThreadPoolType = 2 // Config.THREAD_P_TYPE_GENERAL 입니다.
GeneralThreadPoolSize = 0 // Config.THREAD_P_SIZE_GENERAL 입니다.
그리고 우리 config폴더의 지정되있는 내용이죠
현재우리는 기본적으로 2번타입의 스레드풀을 사용합니다. 이 2번타입은 위에빨간색으로체크되있는부분이죠
실질적으로 실행되는건 _executor = Executors.newCachedThreadPool(); 입니다.
newCachedThreadPool 의 경우에는 쓰레드를 저장하고 있다가 들어오는 작업 요청에 따라 유연하게
쓰레드를 종료시키거나 생성 시킬수 있다.
노는 쓰레드가 많으면 알아서 판단하여 쓰레드를 종료하거나 반대의 경우 쓰레드를 생성하여 유연하게 작업을 수행한다.
가용한 프로세스보다 더 많은 양의 작업을 처리해야될 경우가 있을 경우 사용하지 않기를 권한다.
이렇게 말하고있습니다.
즉 알아서 쓰레드를 관리해주는거죠 단점은 서버컴에서 사용하는 허용쓰레드양보다 더많은 작업을 처리해야될경우는
사용하지않기를 권한다는거죠 ㅎ
가끔 cmd창보다보면 Thread 에러나실때있습니다. Thread-1-2 막이런식으로나는거요 ㅎ
그걸 가끔 스레드가 부족해서나는 에러라고 착각하시는분이계셔서 말씀드리지만
에바팩기준으로 스레드부족현상이날만한 구조는 거의없습니다 통합이 워낙 에바팀에서 잘해놔서요 ㅎ
예전 엠렉 피렉시절이나 그랬지 요즘은 스레드부족으로 에러날일은없구요 그런에러나는건 안에 null포인트에러가나거나
ArrayIndexOut 에러나는경우가많으니 스레드부족걱정은 하지마시길 ㅎ
추가내용
스레드풀의 api 설명
풀 내부의 스레드를 사용해 작업을 실행하는 방법을 사용하면, 작업별로 매번 스레드를 생성해 처리하는 방법보다는 굉장히 많은 장점이 있다. 매번 스레드를 생성하는 대신 이전에 사용했던 스레드를 재사용하기 때문에 스레드를 계속해서 생성할 필요가 없고, 따라서 여러개의 요청을 처리하는데 필요한 시스템 자원이 줄어드는 효과가 있다. 더군다나 클라이언트가 요청을 보냈을때 해당 요청을 처리할 스레드가 이미 만들어진 상태로 대기 하고 있기 때문에 작업을 실행하는 데 딜레이가 발생하지 않아 전체적인 반응 속도도 향상된다.
newFixedThreadPool : 처리할 작업이 등록되면 그에 따라 실제 작업할 스레드를 하나씩 생성한다. 생성 할 수 있는 스레드의 최대 개수는 제한되어 있으며 제한된 개수까지 스레드를 생성하고 나면 더 이상 생성하지 않고 스레드 수를 유지한다.
(만약 스레드가 작업하는 도중에 예상치 못한 예외가 발생해서 스레드가 종료되거나 하면 하나씩 더 생성하기도 한다.)
newCachedThreadPool : 캐시 스레드 풀은 현재 풀에 갖고 있는 스레드의 수가 처리 할 작업의 수보다 많아서 쉬는 스레드가 많이 발생할 때 쉬는 스레드를 종료시켜 훨씬 유연하게 대응할 수 있으며, 처리할 작업의 수가 많아지면 필요할 만큼 스레드를 새로 생성한다. 반면 스레드의 수에는 제한을 두지 않는다.
newSingleThreadExecutor : 단일 스레드로 동작하는 Executor로서 작업을 처리하는 스레드가 단 하나뿐이다. 만약 작업 중에 Exception이 발생해 비정상적으로 종료되면서 새로운 스레드를 하나 생성해 나머지 작업을 실행한다. 등록된 작업은 설정된 큐에서 지정하는 순서에 따라 반듯이 순차적으로 처리된다.
newScheduledThreadPool : 일정 시간 이후에 실행되거나 주기적으로 작업을 실행할 수 있으며, 스레드의 수가 고정되어 있는 형태의 Executor.Timer 클래스의 기능과 유사하다.
[출처] [에바팩강좌] ThreadPool System에 대해서 알아보자 (비공개 카페)