0

임의로 선택한 용량이 10 인 LinkedBlockingQueue와 1000 행의 입력 파일이 있습니다. 내- Executors.newSingleThreadExecutor() - line == null까지 호출 buffer.readline()를 사용하여 처음으로 처리하는 서비스 클래스의 main 메서드에서 하나의 ExecutorService -type 변수가 있고 다음 - 루프 Executors.newSingleThreadExecutor() --ten 스레드를 처리하고 출력 파일에 쓰기, !queue.take().equals("Stop") 때까지. 그러나 파일에 행을 작성한 후에 디버그 모드에있을 때 큐의 용량이 결국 max (10)에 도달하고 처리 스레드가 queue.take()을 실행하지 않습니다. 모든 스레드는 running 상태에 있지만 프로세스는 queue.put() 이후에 중단됩니다. 이 문제를 일으키는 원인은 무엇이며 단일 변수 대신 스레드 풀링 또는 여러 개의 ExecutorService 핸들러 변수 조합을 사용하여 해결할 수 있습니까?하나의 생산자 Executors.newSingleThreadExecutor()로 10 명의 소비자가 파일 처리

//app settings to get values for keys within a properties file 
AppSettings appSettings = new AppSettings(); 
BlockingQueue<String> queue = new LinkedBlockingQueue<String>(10); 

maxProdThreads = 1; 
maxConsThreads = 10; 

ExecutorService execSvc = null; 

for (int i = 0; i < maxProdThreads; i++) { 

     execSvc = Executors.newSingleThreadExecutor(); 

     execSvc.submit(new ReadJSONMessage(appSettings,queue)); 

    } 

    for (int i = 0; i < maxConsThreads; i++) { 

     execSvc = Executors.newSingleThreadExecutor(); 

     execSvc.submit(new ProcessJSONMessage(appSettings,queue)); 

    } 

읽기 방법 코드 :

buffer = new BufferedReader(new FileReader(inputFilePath)); 

    while((line = buffer.readLine()) != null){ 

      line = line.trim(); 

      queue.put(line); 

     } 

처리 및 쓰기 코드 : 처리에서

while(!(line=queue.take()).equals("Stop")){ 

     if(line.length() > 10) 
     { 

      try { 
       if(processMessage(line, outputFilePath) == true) 
       { 
        ++count; 
       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
      }    
     } 
    } 


public boolean processMessage(String line, String outputFilePath){ 
    CustomObject cO = new CustomObject(); 
    cO.setText(line); 
    writeToFile1(cO,...); 
    writeToFile2(cO,...); 
} 

public void writeOutputAToFile(CustomObject cO,...){ 
    synchronized(cO){ 
     ... 
     org.apache.commons.io.FileUtils.writeStringToFile(...) 
    } 
} 


public void writeOutputBToFile(CustomObject cO,...){ 
     synchronized(cO){ 
      ... 
      org.apache.commons.io.FileUtils.writeStringToFile(...) 
     } 
    } 
+1

읽기 및 쓰기 코드를 게시하십시오. 나는 네가 거기 어떻게 든 들어오고 있다는 느낌을 받는다. –

+0

당신의 대답은 아니지만, 하나의 Executors.newCachedThreadPool()을 루프 외부에 두어 사용하는 것이 좋습니다. 이렇게하면 하나의 호출 ('exeSvc.shutdown()')으로 모든 스레드를 종료 할 수 있습니다. – teppic

+0

스레드 덤프를 사용하여 스레드가 차단 된 위치를 확인하십시오. – teppic

답변

0

하고 코드를 작성 서비스 main 방법의 현재 상태에 대한

개요 .. 모든 자원이 적절하게 닫혀 있는지 확인하십시오. 아마도 자원이 스레드가 계속 실행되고 ExecutorService가 유휴 스레드를 찾을 수 없기 때문에 제대로 닫히지 마십시오.