루프에서 일부 청취자에게 통지합니다.청취자를 호출 할 때 허용되는 최대 처리 시간을 적용하십시오.
for (Iterator it = listeners.iterator(); it.hasNext();) {
MyListener l = (MyListener) it.next();
l.notifyEvent(event);
}
나는 리스너가 통지 방법에서 무엇을하고 있는지 전혀 모른다 - 아주 오래 걸릴 수 있습니다 또는 입력을 기다리고 차단. 시스템의 응답 성을 보장하기 위해 다음 청취자와 계속 진행하기 전에 최대 처리 시간을 허용하려고합니다.
메서드 호출을위한 최대 처리 시간을 보장하기 위해 허용되는 패턴은 무엇입니까?
- 산란 신고를위한 새 스레드 :
나는 두 가지 가능성을 생각. 시간 내에 돌아 오지 않으면 새 스레드를 만들고 다음 스레드를 처리하십시오. 결국 첫 번째 사람이 돌아 오면 그냥 그냥 내버려 둬. 이 전략에 대한 코드 예제를 제공 할 수 있습니까?
- 현재 처리중인 리스너 스레드에 인터럽트를 보내고 이것이 리턴하게되기를 바랍니다.
다른 아이디어 또는 모범 사례?
추 신 : Java 1.4와 함께 java.util.concurrent 백 포트를 사용하므로 j.u.c 구문을 사용할 수 있습니다.
편집 : 여기 내가 개발 한 해결책이 있습니다. ExecutorServices를 사용하므로이 간단한 목적을 달성하는 데 약간 무거움. 이 스레드는 해당 스레드가 수신기에서 멈추기 전까지 하나의 추가 스레드 만 사용합니다. 그런 다음 새 스레드 (새 ExecutorService에 있음)를 생성하여 다음 리스너와 함께 작업합니다. 참고 :이 솔루션은 스레드 안전성이나 동시성을 지원하지 않습니다. 하나 개의 스레드가 doNotify()
private final Queue listeners = new ConcurrentLinkedQueue();
private final long timeout;
private final TimeUnit unit;
private ExecutorService threadPool = Executors.newFixedThreadPool(1);
public void doNotify(){
for (Iterator it = listeners.iterator(); it.hasNext();) {
final MyListener l = (MyListener) it.next();
Future future = threadPool.submit(new Runnable() {
public void run() {
l.notifyEvent();
}
});
try {
future.get(timeout, unit); // wait for task to be executed
} catch (InterruptedException e1) {
// ignore for now
} catch (ExecutionException e1) {
// ignore for now
} catch (TimeoutException e1) {
threadPool.shutdown(); // pool accepts no new tasks, and will exit when done
threadPool = Executors.newFixedThreadPool(1); // make new thread for next listener
}
}
}
입력 해 주셔서 감사합니다. 나는 그것을 기반으로 할 것입니다. 많은 청취자의 경우 솔루션에서 피하고자하는 많은 스레드가 생성됩니다. 새 스레드는 필요한 경우에만 만들어야합니다 (정상적인 리스너가 정시에 응답한다고 가정). – Philipp
@ Philipp, 그 이유는 대안 설계 선택 사항으로 스레드 풀을 언급했기 때문입니다. – aioobe