2014-05-09 1 views
0

Java에서 캐시 된 스레드 풀을 구현하여 버스에서 들어오는 데이터를 읽으려고합니다. 모든 것이 잘 작동합니다 ... 데이터가 버스에 들어오는 한.캐시 된 스레드 풀 무한 성장

데이터 케이블을 분리 한 채로두면 풀에서 끝없는 스레드가 생성되기 시작합니다. 간헐적으로/proc/{PID}/fd를 확인하면 약 1 시간 만에 8에서 100+로 바뀝니다. 결국 시스템이 충돌합니다.

이 스레드에 대한 시간 초과 값 (30 초)을 제출하고 로그 파일에 표시된 TimeoutException catch를 트리거합니다. 이 스레드는 시간이 초과되면 종료되지 않아야합니까?

일부 코드 :

private static ExecutorService executorService = Executors.newCachedThreadPool(); 

(I 나중에 호출을 제공)

long[] rawFrame; 
Future<long[]> future = executorService.submit(callable); 
try { 
    rawFrame = future.get(timeout, timeUnit); // timeout is 30 seconds 
    // Do some things with the raw frame and store as parsedFrame 
    return parsedFrame; 
} catch (TimeoutException e) { 
    LOGGER.error("Bus timeout. Check connection"); 
    return null; 
} finally { 
    future.cancel(true); 
} 

난 그냥 자바에서 동시 처리를해야하지만 내가 아는 한, 이러한 프로세스는 어떻게해야 배우고 시간 초과되었지만 대신 데이터를 비우지 않는 버스의 데이터를 기다리는 동안 앉아있을뿐입니다.

무엇이 누락 되었습니까?

편집 : 도와 주셔서 감사합니다.

다음은 GET을 (시간 제한하는 제한 시간 내 호출

private class BusCallable implements Callable<long[]> { 

private long messageId; 
private boolean readAnyFrame = false; 

public BusCallable() { 
    super(); 
    readAnyFrame = true; 
} 

public BusCallable(long id) { 
    super(); 
    this.messageId = id; 
    readAnyFrame = false; 
} 

@Override 
public long[] call() throws Exception() { 
    if (readAnyFrame) { 
     return read(busInterface); 
    } 
    return readFrame(busInterface, messageId); 
} 

답변

1

호출하는 Future.get())가 아닌 스레드 (ie.whataver 호출 가능의 호출에() 메소드)입니다. 귀하의 호출 가능 항목이 종료되지 않으면 서비스에 남아있게되며 계속 추가하면 호출 가능 항목이 누적됩니다. callable의 쓰레드에 타임 아웃 메커니즘을 설치해야합니다.

+0

이 작업을 수행하는 방법에 익숙하지 않습니다. callable의 call() 메소드에 타이머를 유지합니까? – lrich

+1

@Irich 귀하의 Callable에게 도움을 요청하십시오. 기회는 기다리는 곳 중 하나가 정확한 시간이며, 어느 곳에서 시간 제한을 넣을 지 알 수 있습니다. 일반적인 대답은 없으며, 당신이하는 일에 달려 있습니다. – schmop

+0

호출 가능 – lrich