임의로 선택한 용량이 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(...)
}
}
읽기 및 쓰기 코드를 게시하십시오. 나는 네가 거기 어떻게 든 들어오고 있다는 느낌을 받는다. –
당신의 대답은 아니지만, 하나의 Executors.newCachedThreadPool()을 루프 외부에 두어 사용하는 것이 좋습니다. 이렇게하면 하나의 호출 ('exeSvc.shutdown()')으로 모든 스레드를 종료 할 수 있습니다. – teppic
스레드 덤프를 사용하여 스레드가 차단 된 위치를 확인하십시오. – teppic