2015-01-02 2 views
3

나는 모든 가능한 결과를 얻으려고하는 프로그램을 만들고 있습니다. 프로그램의 스레드는 더 많은 스레드를 생성합니다 (천 개가 조금 넘음). 나는 정말로 멀티 쓰레딩에 나쁘다. 나는 쓰레드의 생성이 멈추지 않을 것을 두려워한다. 이클립스 IDE는 종료 버튼을 가지고 있는데, 실행중인 모든 스레드를 멈추게 할 것인가? JVM이 이것을 처리 할 수 ​​있습니까?Java에서 1K 개 이상의 스레드를 실행하는 것이 안전합니까?

+2

예,'JVM'을 종료하면 모든 스레드가 실행을 멈 춥니 다 – Abhishek

+3

이 높은 수의 스레드를 만들면 어떤 이점이 있습니까? (성능 저하가 나타납니다.) –

+3

1000 개 이상의 스레드를 실행할 수 있지만 결국에는 각 개별 스레드를 실행하기 위해 1000 개 이상의 코어가 없습니다 – smac89

답변

5

예. 이클립스 실행 종료 JVM에서 종료 버튼을 클릭하면 해당 JVM이 중단되고 실행중인 모든 스레드가 중지됩니다 (JVM 프로세스 종료와 마찬가지로).

천 개의 스레드를 실행하는 경우에는 권장하지 않습니다 ... 각 스레드가 n 개의 CPU 코어에서 최대 ~ n/1000 시간 만 실행할 수 있기 때문에 매우 느린 방식으로 들립니다.

+0

감사합니다. Frisch, 저를 도왔습니다. : D – dark32

+2

그러나 I/O 코드를 차단하는 것이 좋습니다. –

1

실제로 Java 프로그래밍 언어로 1000 개 이상의 스레드를 열지 않아도됩니다. 그러나 문제는 그것이 작업을 느리게 할 것입니다.

스레드의 작동 방식을 알고 있습니까? 스레드는 OS의 도움으로 환경을 생성하므로 응용 프로그램 사용자는 프로그램이 병렬로 실행되고 있다고 느낄 수 있습니다. 그러나 실제 시나리오는 다릅니다. 단일 코어 프로세서를 갖는 컴퓨터는 즉시 한 동작을 처리 할 수 ​​있습니다. 우리의 OS는 하나씩 하나씩 운영을 보냅니다. 그래서 우리는 사용자가 자신들이 동시에 운영되고 있다고 느낄 수 있습니다.

예를 들어 세 가지 스레드 응용 프로그램을 고려해 보겠습니다. 각 쓰레드는 for 루프를 가지고있다. 첫 번째 스레드는 루프 내부의 숫자를 추가하고 result1이라는 변수에 결과를 저장하고 두 번째 스레드는 루프 내부의 숫자를 곱하고 그 결과를 result2라는 변수에 보관하며 세 번째 스레드는 루프 내부의 숫자를 뺀 다음 이름이 지정된 변수에 결과를 보관합니다. result3.

이제 모든 스레드가 같은 순간에 시작되고 모두가 같은 우선 순위를 갖게되면 OS는 하나씩 명령을 전송합니다. If는 result1로 추가 할 번호를 보낼 수 있습니다. 다음 순간에 결과를 곱하기 위해 숫자를 보낼 수 있습니다. 다음 순간에 결과를 빼기 위해 숫자를 보낼 수 있습니다 3. 다음 순간에 다시 추가 할 수 있습니다.

즉, 실제로 단일 코어 프로세서는 3 가지 계산을 동시에 계산할 수 없습니다. 그것은 하나의 계산을 계산하고 나머지 것들을 멈추게하고 이런 식으로 진행합니다.

이제 1000 스레드를 실행하면 전체 프로세스가 느려지는 것을 알게되었습니다. 언급 된 작업에서 성능이 문제가 아니며 출력 만 필요하면 1000+ 스레드를 실행할 수 있습니다.

그러나 개선 된 성능이 필요한 경우 다른 것을 생각해야합니다. Map Reduce에 대해 열심히 있으십니까? Hadoop 프레임 워크로 맵 축소를 구현하면 이러한 유형의 문제에서 더 나은 성능을 얻을 수 있습니다. 그러나, 먼저 맵 축소 프레임에서 문제점을 설계해야합니다. 그리고이 프레임 워크는 둘 이상의 컴퓨터를 사용하여 동시에 작업을 계산합니다.

다른 해결책이 우선 순위를 설정할 수 있습니다. 자바에서는 스레드에서 우선 순위를 설정할 수 있습니다. 중요한 작업에 간단한 작업보다 높은 우선 순위를 부여 할 수 있습니다. 우선 순위가 높은 태스크와 낮은 태스크로 문제의 태스크를 구별 할 수 있다면 성능을 더 정확하게 파악할 수 있습니다.

관련 문제