メインの呼び出しスレッドがブロックされないように、いくつかのタスクを並行して実行する必要があります。タイムアウトが発生すると各タスクは終了し、ユーザーが気が変わった場合はすべてのタスクを一度にキャンセルできます。
私が思いついたのは次のとおりです。
メイン スレッドは新しい DownloadWatcherThread を呼び出します (ブロックされません)。DownloadWatcherThread は次のようなメソッドを実行しました:
public void run() {
executorService = Executors.newFixedThreadPool(numberOfThreads);
futures = new ArrayList<Future>();
for(Component component: components) {
PackageDownloader downloader = new PackageDownloader(component);
futures.add(executorService.submit(downloader));
}
for(Future future: futures){
try {
future.get(8, TimeUnit.HOURS);
} catch(Exception e) {
future.cancel(true);
}
}
executorService.shutdown();
}
public void cancelTasks(){
executorService.shutdownNow();
}
では、問題は、これが 3 つの要素すべてを達成するための正しい方法ですか?
- 呼び出しスレッドをブロックしない
- 時間がかかる場合はタスクをタイムアウトにする
- ユーザーが望む場合、すべてをキャンセルする