2011-05-07 3 views
1

내 정렬 알고리즘을 만들 수있는 최대 스레드 수를 결정하고 싶습니다. 그걸 위해서 java.lang.Runtime을 사용하고 싶습니다.Java-VM에서 사용할 수있는 스레드의 최대 수를 결정하는 방법은 무엇입니까?

한계에 도달하면 현재 스레드 수를 계산하고 새 스레드 생성을 중단하고 싶습니다.

+0

당신은'java.lang.Runtime'을 사용하기 위해 당신을 어떻게 단서에 넣을 수 있습니까? – akf

답변

7

JVM의 최대 스레드 수는 일반적으로 수천의 어딘가에 있습니다. 계산 알고리즘을 최적화하기 위해 여러 스레드를 사용하는 경우 시스템에서 실행되는 프로세서의 개수 이상을 실제로는 원하지는 않습니다. 확인하려면 Runtime.getRuntime().availableProcessors()을 사용하십시오.

+0

은 스레드가 사용되는 경우이 번호가 업데이트됩니까? –

+0

그것은 얼마나 많은 프로세서가 시스템에 있는지를 알려주며, 얼마나 많은 프로세서가 작동하는지 알려주지 않습니다. – WhiteFang34

+0

이것이 사실이 아닌 경우가 있습니까? 수십 개의 프로세서가있는 시스템에서 수천 개의 스레드를 실행하여 더 나은 성능을 얻을 수있는 곳은 어디입니까? – Nathan

0

visualvm을 프로세스에 첨부하여 스레드 수를 확인할 수 있습니다. 나는 모든 플러그인을 다운로드 한 버전 1.3.2를 추천한다.

또한 Spring과 Executor 풀을 사용하는 것이 좋습니다. 스레드 풀의 크기를 구성 할 수있는 좋은 방법입니다.

2

난 당신이 ... 약간 다른 각도에서 문제를 보면 좋을 것

내가 무엇을 의미하는 것은 당신이

"what's the maximum number of threads I can create and use for task x?" 

을 요구하고 당신이 요구하는 경우 그 때문에 당신은, 당신이 대신 물어 수있는 가장 스레드 당신이 더 나은를 사용하여 생각

"how many threads would I need to complete x most efficiently?" 

매우 예를 들어 듀얼 코어 시스템에서 수천 개의 스레드를 사용하면 작업 x가 더 잘 수행 될 것 같지 않습니다. 예를 들어, 일반적인 지침으로서, CPU 결합 작업 (정렬 알고리즘은 아마도 임)에 대해, 최적의 스레드 수가

threads = number of CPUs + 1 

볼이다 How to find out the optimal amount of threads?

스레드의 실제 최대 개수는 OS에 의존 JVM과 JVM 내에서 사용하기 위해 구성된 메모리의 양. 새 쓰레드를 만들려면 Java의 힙 메모리가 아닌 OS 메모리가 필요합니다. 즉, 수천 개의 스레드를 작성하는 경우 -Xmx를 사용하여 메모리 부족 현상이 발생할 수 있습니다. 사실, 할당하는 Java 힙 메모리가 적을수록 기본 메모리가 더 많아 지므로 더 많은 스레드를 작성할 수 있습니다.

this article을 참조하고 펜과 종이로 max를 수행하는 방법에 대한 느낌을 얻으십시오.

당신이 애플리케이션에서 무제한의 쓰레드를 사용하고 싶다면, 필요한만큼 생성하여 쓰레드 풀을 생성하는 Executors.newCachedThreadPool()을 사용할 수있다. 일상적인 사용을 위해이 유형의 풀을 사용하는 것을 권장하지 않지만 원래의 질문과 관련이 있습니다.

희망이 있습니다.

관련 문제