[英]Observer pattern with threads
我想運行幾個線程並在我的main方法結束時加入它們,所以我可以知道它們何時完成並處理一些信息。
我不希望將我的線程放在一個數組中並逐個執行join(),因為join是一個阻塞方法,我會在主線程中等待一些仍在運行的線程,而其他線程可能已經完成,沒有可能知道。
我已經考慮過為我的線程實現一個觀察者模式的可能性:一個帶有update()方法的接口,一個從線程擴展的抽象類(或實現runnable),用於監聽器的set和get方法以及一個啟動所有線程的類等他們完成
如果我的理解是正確的,觀察者就不會阻塞特定的join()來獲取一個線程。 相反,它將以某種方式等待,直到線程調用update()方法來執行操作。 在這種情況下,應在線程完成后立即調用update()。
我對如何實現這一點毫無頭緒。 我嘗試過類似的模型,但我不知道如何使用觀察者/監聽器喚醒/阻止我的主線程。 我用這個舊帖子作為模板: 如何知道其他線程是否已完成? 但是一旦線程調用update()方法,我找不到喚醒main方法的方法。 將只為所有線程實例化一個觀察者對象。
你能想到一種方法來使用觀察者模式來等待所有線程完成而不會阻塞main一個接一個的join()調用嗎? 任何其他解決這個問題的建議將不勝感激。 提前致謝。
Java已經有了這樣做的API: CompletionService
。
一種服務,它將新異步任務的生成與已完成任務的結果消耗分離。 生產者提交執行任務。 消費者完成任務並按照他們完成的順序處理結果。
我認為你不需要觀察者模式。 線程等待任何結果將不得不阻止,否則它將完成或循環無窮大。 您可以使用某種BlockingQueue - 生產者將計算結果添加到阻塞隊列(然后完成),主線程將在沒有任何結果時接收這些結果阻塞。
對你好消息,它已經實現了:) CompletionService
和Executors framework
很好的機制。 嘗試這個:
private static final int NTHREADS = 5;
private static final int NTASKS = 100;
private static final ExecutorService exec = Executors.newFixedThreadPool(NTHREADS);
public static void main(String[] args) throws InterruptedException {
final CompletionService<Long> ecs = new ExecutorCompletionService<Long>(exec);
for (final int i = 0; i < NTASKS ; ++i) {
Callable<Long> task = new Callable<Long>() {
@Override
public Long call() throws Exception {
return i;
}
};
ecs.submit(task);
}
for (int i = 0; i < NTASKS; ++i) {
try {
long l = ecs.take().get();
System.out.print(l);
} catch (ExecutionException e) {
e.getCause().printStackTrace();
}
}
exec.shutdownNow();
exec.awaitTermination(50, TimeUnit.MILLISECONDS);
}
聽起來像你正在尋找Heinz M. Kabutz博士最近討論過的計數完成服務 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.