0

자바에서 병렬 스레드 세트를 실행하려고합니다. 다음과 같이 고차 함수를 통해 이들을 생성합니다.자바에서 다중 병렬 스레드가 종료되지 않습니다

public static void parallelizedMap(Consumer<String> f, List<String> list, int count) { 
    List<List<String>> parts = new ArrayList<List<String>>(); 
    final int N = list.size(); 
    int L = N/(count - 1); 
    for (int i = 0; i < N; i += L) { 
     parts.add(new ArrayList<String>(list.subList(i, Math.min(N, i + L)))); 
    } 
    for (List<String> e : parts) { 
     Runnable r = new Runnable() { 
      public void run() { 
       e.forEach(f); 
      } 
     }; 
     new Thread(r).start(); 
    } 
} 

이 메서드는 몇 분마다 호출됩니다. 몇 분 후에 수백 개의 스레드를 생성합니다. 모든 스레드는 20 초 동안 만 실행됩니다. 하지만 내 디버깅은 종료 결코 것으로 나타났다 및 그 난이 예외 얻을 : 사전

+3

* 모든 스레드는 20 초 동안 만 실행됩니다. 하지만 디버깅을하면 절대로 끝내지 않는 것으로 나타났습니다. *이 문장은 서로 모순됩니다. 그리고'f'가하는 일을 볼 수 없으므로 많은 도움을주기가 어렵습니다. – shmosel

+2

몇 가지 조언 : 의미있는 변수 이름을 사용하십시오! 또한 완전한 예제를 제공하십시오. –

+0

디버거를 사용하는 경우 완료해야하지만 실행하지 않은 스레드를 일시 중단하고 어떤 문이 중단되는지 확인합니다. –

답변

0

해결책은 모든 스레드에게 여분의 JDBC 연결을 제공하고 하나를 공유하도록하지 말아야한다는 것입니다. 이것은 교착 상태를 해결하고 예상대로 종료됩니다.

+0

무엇? 향취? –

+0

심각한가요? – caesar

+0

이 질문과 답변은 실제로 다른 사람에게 도움이되지 않습니다. 귀하는 귀하의 질문에 JDBC를 언급하지 않습니다. 후세에 대한 편집 고려 중. – Gray

1

내가 문제가 스레드 생각하지 않는다에서

java.lang.OutOfMemoryError: GC overhead limit exceeded 

감사합니다. 그러나 count의 값이리스트의 크기의 2 배 이상인 경우 :

final int N = list.size(); // N = 10, count = 22 
int L = N/(count - 1); // L = 10/(22-1) = 0.476/L = 0.4d = (int) 0; 
for (int i = 0; i < N; i += 0) { 
    parts.add(new ArrayList<String>(list.subList(i, Math.min(N, i + 0)))); 
} 

반복은 무한 루프이지만 메모리 사용량은 매 반복마다 증가합니다.

당연히 그것 OutOfMemory.

+1

is not it 10/4 = 2.5 => (int) 2? – caesar

+0

@caesar 예, 업데이트 된 답변. –

+0

오케이, 당신의 요지를 봅니다. 이것은 맞지만, 내 경우에는 항상 N >> 카운트가되고 이것은 일어나지 않을 것이다;) – caesar