2013-05-11 9 views
2

방금 ​​스레드 풀을 사용하여 연습을 시작했습니다. 자바로 서버 클라이언트 뱅크 애플리케이션을 만들고 있는데, 오라클의 설명서를 살펴보고 캐시 된 쓰레드 풀을 사용하려고 생각하고 있습니다. 하지만 몇 가지 계산 테스트를 실행하고 고정 된 스레드 풀 빠른 것으로 보였다. 캐시 된 스레드 풀이 지연되어 너무 많은 불필요한 스레드가 생성되는 것 같습니다. (또는 어쩌면 내가 여기서 뭔가 잘못하고있다).Java : 여기에 어떤 종류의 ThreadPool을 사용해야합니까?

제 질문은 실제 상황에서 어떤 것이 더 효율적입니까? 아니면 더 효율적일 수있는 또 다른 종류의 수영장이 있습니다. 사용하지 않는 스레드 (대신 새로 만드는)이 자동으로 재사용, 위의 라인에서

ExecutorService executor = Executors.newCachedThreadPool(); 

    for (int i = 0; i < 500; i++) { 
      Runnable worker = new serv(10000000L + i); 
      executor.execute(worker); 
    } 

, 또는 거기에 내가 추가 할 필요가 뭔가 다른 :

또한, 내 계산 시험에서 나는 몇 줄이 이런 일이 일어나기 위해서?

+0

작업이 CPU 바운드 인 경우 보유하고있는 CPU 수와 일치하는 고정 풀을 사용하면 더 효율적입니다. –

답변

1

는 Executors.newCachedThreadPool에 대한 설명() API 60 초간 사용되지 않았던

스레드가 종료되고 캐시에서 제거되어있다. 따라서 충분히 오랫동안 유휴 상태를 유지하는 풀은 리소스를 소비하지 않습니다. 내가 늦었

2

, 당신은 이미 다른 대답을 인정하지만, 여기에 내 걸릴 : 당신은 당신이 무엇을하고 있는지 알지 못한다면

내가 newCachedThreadPool()를 사용하는 것이 좋습니다 않을 것입니다. 그 이유는 제출 된 작업을 실행하는 데 필요한만큼의 스레드를 생성하기 때문입니다. 너무 많은 쓰레드가 생성 되었기 때문에 디스크립터가 부족하거나 JVM이 충돌하는 등의 바람직하지 않은 상황이 발생할 수 있습니다. 하지만 60 초 후에 풀에서 유휴 스레드를 제거하지만 여전히 무한대로 증가합니다.

돌아 가기 요 질문 : 위의 라인에서

, 사용되지 않는 스레드가 자동으로 (대신에 새로 생성) 재사용, 또는 거기에 내가 이런 확인하기 위해 추가해야 할 뭔가 다른거야?

에 달려 있습니다. 귀하의 각 Runnable worker이 완료하는 데 시간이 오래 걸리는 경우 (예 : 2 분) 따라서 루프에서 500 개의 스레드를 생성하게됩니다. 모든 작업이 끝나면 500 개의 스레드가 60 초 동안 메모리에 저장되고 요청됩니다.

스레드를 다시 사용하려면 'Executors.newFixedThreadPool (...)'을 사용하고 사용할 스레드 수를 지정하십시오. 스레드보다 많은 작업을 제출하면 스레드는 스레드가 사용 가능해질 때까지 대기열에서 대기합니다.

관련 문제