작업 대기열과 작업 대기열을 몇 초 내에 한 번씩 볼 수있는 스레드가 있습니다.알 수없는 비동기 작업 대기
다른 코드 섹션 (물론 다른 스레드에서)이 루프에서 작업을 생성하고 (루프 외부에서 미리 작업 수를 알 수 없음) 큐에 삽입합니다. 작업에는 '결과'개체가 포함되어 있으며 외부 스레드 (해당 작업을 만든)는 모든 작업이 완료 될 때까지 기다렸다가 마지막으로 결과를 가져와야합니다. 문제는 Java Semaphore \ CountDownLatch 등을 결과 객체에 전달할 수 없다는 것입니다. 왜냐하면 미리 모니터의 수를 모르기 때문입니다. 또한 invokeAll을 사용하는 Executor를 사용할 수 없으며 작업이 동기화되지 않았기 때문에 Future 객체를 기다릴 수 없습니다. 외부 스레드는 작업을 대기열에 넣고 다른 스레드는 작업을 실행할 때 대기열을 실행합니다.
내가 생각한 유일한 해결책은 결과 집합과 모니터 카운터를 포함하는 '반전 된 세마포어'클래스를 만드는 것입니다. 답이 yes이면 어떤 로크 대상에게 통지한다 대향 == 0 인 경우 상기 getResult를 기능 확인 것이며, getResult를 기능이 잠금 기다리는 각 addTask 방법 semaphore.acquire를 호출
public class InvertedSemaphore<T> {
Set<T> resultSet;
int usages;
final Object c;
public InvertedSemaphore() {
resultSet = Collections.synchronizedSet(new HashSet<T>());
usages = 0;
c = new Object();
}
public void addResult(T result) {
resultSet.add(result);
}
public void addResults(Set<T> result) {
resultSet.addAll(result);
}
public void acquire() {
usages++;
}
public void release() {
synchronized (c) {
if (--usages == 0) {
c.notify();
}
}
}
public Set<T> getResults() {
synchronized (c) {
try {
while (usages > 0) {
c.wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return resultSet;
}
}
및 각 (동기화되지 않은) 작업은 작업이 끝나면 semaphore.release를 호출합니다.
꽤 복잡해 보입니다. 자바 동시 라이브러리 나 다른 라이브러리에서 더 나은 해결책이 있다는 것을 확신합니다.
어떤 생각이 appriciated됩니다 :)
'CountUpLatch'가 필요한 것 같습니다.:) – corsiKa