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

完了した将来のタスクのキューイングを処理するExecutorCompletionServiceを使用できます。poll()メソッドを使用して、完了したタスクをポーリングします。

于 2012-11-13T12:08:41.973 に答える
0

いくつかのコメント:

  • 現在の設計は、最初のダウンロードが完了するまでブロックされ、次に 2 番目のダウンロードが完了するまでブロックされます。最初のダウンロードに 8 時間かかる場合は、他のダウンロードの完了に対応する機会を逃した可能性があります。これが問題になる場合は、再設計が必要になる場合があります。

  • メソッドcancelTasksは、スレッドを停止するために executor サービスのみに依存しています。PackageDownloader尊重スレッドが中断することを確信していますか? そうでない場合、スレッドは実際には停止しない可能性があります。

コードをhttps://codereview.stackexchange.com/に投稿することをお勧めします。

于 2012-11-13T12:06:14.547 に答える