我需要并行执行一些任务,这样主调用线程就不会被阻塞。如果发生超时,每个任务都将被终止,如果用户改变主意,我将能够一次取消所有任务。
我想出的是:
主线程调用新的 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 种成分的正确方法吗?
- 不阻塞调用线程
- 如果需要很长时间,则超时任务
- 如果用户愿意,可以取消整个事情