다음과 같은 시나리오가 있습니다 : 여러 이벤트가 각각 다른 유형의 소스에서 제공됩니다. 나는 연속적으로 같은 유형의 각 사건으로 무언가를 할 필요가 있으며, 다른 유형이라면 병행하여 처리해야한다. 의미 소스쓰레드가 알림으로 깨어 나지 않았습니다.
이벤트 : A1, A2, B1, A3, B2, C1
- 수신기 A, A1, A2와 A3을 대기해야하며, 즉 순서대로 작동 다른 스레드에 평행 한 B로서
- 수신기 C 같은 다른 스레드 병렬 같은
- 수신기 B와 동일한 단일 쓰레드 ,,,, I는 t를 실현하고있는 무슨
그의? 일반적인 용어로, 나는 새로운 스레드로 초기화 한 다음 wait()을 호출하는 각 이벤트 유형에 대한 모니터를 가지고 있습니다. 모든 모니터에는 대기열이 있습니다.
Monitor.java는
public void run(){
while(!killed){
synchronize(this){
while(this.stopped){
wait(); //it waits here when initialized, waiting for the first event
}
while(eventQueue.size() > 0){
//do something with the event
}
//i set the flag stopped = true again to wait for the next event
this.stopped = true;
}
}
}
이벤트가 도착, 난는 동안
public void awake(Event event){
synchronize(this){
eventQueue.add(event);
this.stopped = false;
notify();
}
}
나누기 있도록 후) (모니터 통지 큐에 추가 (실행 가능한 구현) "killed"플래그는 특정 기준이 충족 될 때까지 스레드를 활성 상태로 유지하는 데 사용됩니다. 그런 다음 kill 플래그를 true로 설정하고 모니터에 스레드 종료를 알립니다.
제 문제는 일련의 이벤트를 실행할 때 가끔 스레드가 notify()로 깨어 나지 않는 경우입니다. 때로는 10 개의 이벤트 중 10 개가 처리되고, 때로는 10 개 중 8 개가 처리됩니다.
나는 내 문제에 대한 대안을 찾고있는 동시 API를보고 있었지만 좋은 것을 찾을 수는 없다. 이 문제에 어떻게 대처할 수 있는지 조언 해 주시겠습니까?
나는 좋은 방법으로 내 문제를 설명하고 싶습니다. 그렇지 않다면 물어보십시오.
미리 감사드립니다.
FYI :'this.stopped'는 다중 스레드에서 사용되기 때문에 '휘발성'이어야합니다. – Gray
'notify()'또는'notifyAll()'? – Raedwald