我有一個任務隊列和一個線程,在幾秒鐘內窺探一次隊列,並且它有一個任務執行它。等待未知數量的異步任務
我有另一個代碼段(當然是另一個線程),它在循環中創建任務(我無法預先從循環外部知道任務數量)並將它們插入到隊列中。任務包含一些「結果」對象,外部線程(創建這些任務)需要等待所有任務完成並最終從每個任務中獲取結果。 問題是我無法將java Semaphore \ CountDownLatch等傳遞給結果對象,因爲我不知道提前顯示器的數量。 我也不能使用使用invokeAll的Executor,或者等待Future對象,因爲任務是不同步的(外部線程只是將任務加入到隊列中,而另一個線程在他有空時執行任務)。
我唯一想到的解決方案是創建一些「反轉信號量」類,它包含一組結果和一個監視器計數器。該功能的getResult將檢查計數器== 0,如果答案是肯定就會通知一些鎖定的對象,以及功能的getResult會等待這個鎖:
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;
}
}
每個addTask方法調用semaphore.acquire,和每個(未同步)任務將在任務結束時調用semaphore.release。
這聽起來很複雜,我很確定在java併發庫中有更好的解決方案。
任何想法將appriciated :)
聽起來像你需要'CountUpLatch'。:) – corsiKa 2012-07-25 17:17:53