0

我需要并行执行一些任务,这样主调用线程就不会被阻塞。如果发生超时,每个任务都将被终止,如果用户改变主意,我将能够一次取消所有任务。

我想出的是:

主线程调用新的 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 种成分的正确方法吗?

  1. 不阻塞调用线程
  2. 如果需要很长时间,则超时任务
  3. 如果用户愿意,可以取消整个事情
4

2 回答 2

0

几点评论:

  • 您当前的设计将阻塞,直到第一次下载完成,然后是第二次,依此类推。如果第一次下载需要整整八个小时,那么您可能错过了对其他下载完成做出反应的机会。如果这是一个问题,您可能需要重新设计。

  • 您的cancelTasks方法仅依赖执行程序服务来停止线程。您对PackageDownloader尊重线程中断有信心吗?如果没有,那么您的线程可能实际上不会停止。

您可能希望在https://codereview.stackexchange.com/上发布您的代码。

于 2012-11-13T12:06:14.547 回答
0

您可以使用ExecutorCompletionService来处理已完成的未来任务的排队。使用poll()方法轮询已完成的任务。

于 2012-11-13T12:08:41.973 回答