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);
}
이 작업을 수행하는 방법에 익숙하지 않습니다. callable의 call() 메소드에 타이머를 유지합니까? – lrich
@Irich 귀하의 Callable에게 도움을 요청하십시오. 기회는 기다리는 곳 중 하나가 정확한 시간이며, 어느 곳에서 시간 제한을 넣을 지 알 수 있습니다. 일반적인 대답은 없으며, 당신이하는 일에 달려 있습니다. – schmop
호출 가능 – lrich