2009-06-25 4 views
2

나는 비트 토 런트 클라이언트에서 일하고 있습니다. 동료들과 의사 소통하는 동안 그들과 의사 소통하는 가장 쉬운 방법은 그들 각각에 대해 새로운 스레드를 생성하는 것입니다. 그러나 사용자가 다수의 동료와의 연결을 유지하기를 원한다면 나는 많은 스레드를 생성하게됩니다.자바 스레드 성능

또 다른 해결책은 피어 개체를 통해 반복하고 e 기간 동안 실행하는 하나의 스레드가 있다고 생각했습니다.

루비 (광산은 자바에 있음)에서 다른 라이브러리를 검사하고 각 새 피어에 대해 하나의 스레드를 생성합니다. 사용자가 연결 수를 100이나 200과 같이 높은 수로 설정하면 하나의 스레드를 생성하면 성능이 저하 될 것이라고 생각합니까? 내가 바로이 같은 의심을했고, 400 개 스레드 (4 년 전) 닷넷 응용 프로그램을 만든 후에는

답변

1

없음 .....

....

그들이하지 않는 제공 많은 일, 괜찮은 기계를 가지고 있으면 괜찮을 것입니다 ...

2

수천 개의 스레드를 실행하지 않는 이상 문제가되지 않습니다. 스레드 풀을 사용하여 절충안을 조사했습니다. 런타임시 CPU 수를 감지하고이를 기반으로 스핀 업 할 스레드 수를 결정한 다음 스레드 풀에 작업을 전달할 수 있습니다.

2

Non-blocking IO (java.nio. *)을 사용하여 문제를 피할 수 있습니다.

0

32 비트 Windows의 경우 실제로 실제로 만들 수있는 기본 스레드 수는 2 개입니다 (2 개의 스레드/스레드 수 * ThreadStackSize (기본값은 2MB) 또는 이와 비슷한 것). 따라서 연결이 너무 많으면 가상 메모리 주소 공간이 부족해질 수 있습니다. 나는 타협이 효과가있을 것이라고 생각한다. 10 스레드 (기계에 따라 다름)를 실행하고 연결을 고르게 분배하십시오. 스레드 내에서이 스레드에 할당 된 피어를 반복합니다. 그리고 최대 연결 수를 제한하십시오.

1

대부분의 워크 스테이션 급 시스템에서는 수 백 개의 스레드가 문제가되지 않으며 코드 작성이 더 간단합니다.

그러나 아이디어를 얻고 싶다면 Java의 NIO 패키지에서 제공하는 non-blocking IO features을 사용할 수 있습니다. Jean-Francois Arcand's blog에는 Glassfish 용 Grizzly 커넥터를 만들 때 얻은 유용한 팁이 많이 포함되어 있습니다.

+0

저는 nio와 일하지 않았습니다. 여기저기서 몇 가지 기사 만 읽었습니다.하지만 두 번째 계획은 선택기를 반복하는 피어를 반복하는 대신에 nio route에 가깝다고 생각했습니다. 니오가 가져올 어떤 종류의 이점들? –

+0

필자는 피어 개체를 반복 처리한다는 의미를 정확히 이해하지 못합니다. 어떤 시점에서 소켓에서 데이터를 읽어야합니다. NIO가 제공하는 non-blocking이 없다면, 쓰레드는 응답이 느린 첫 번째 피어에 갇힐 것이다. 그 스레드를 뜯어 낼 수있는 유일한 방법은 예외를 발생시키는 타임 아웃에 대한 소켓 읽기를위한 것입니다. – erickson

2

풀을 풀 스레드 수를 유지하려면 실행 프로그램을 사용하는 것이 좋습니다.

Executors.newFixedThreadPool(numberOfThreads); 

기본적으로 풀에 "작업"을 추가 할 수 있으며 스레드가 사용 가능 해지면 완료됩니다. 이렇게하면 최종 사용자의 컴퓨터 스레드를 모두 소모하지 않고 동시에 많은 작업을 수행 할 수 있습니다. 16을 원한다면 사용자가 원하는 경우이 번호를 변경할 수 있지만 꽤 안전 할 것입니다.

+0

+1! 기존에 코드를 작성할 때 코드를 작성하는 이유는 무엇입니까? –

0

스레드 풀을 사용하면 상당히 큰 풀 크기 (100 개 정도)로 안전해야합니다. 이 유형의 응용 프로그램에 IO 바인딩이되어 있기 때문에 CPU는 문제가되지 않습니다.

모든 스레드의 메모리 관련 문제를 방지하기 위해 풀 크기를 쉽게 구성하고 적당한 최대 값으로 설정할 수 있습니다. 물론 모든 스레드가 실제로 사용되는 경우에만 발생해야합니다.