11

CallableテストおよびExecutorServiceインターフェイス用のサンプル アプリケーションを実装しようとしています。

私のアプリでは、次のように宣言しました。

ExecutorService exSvc = Executors.newSingleThreadExecutor();

それで:

Future<Integer> test = exSvc.submit(
    new Callable<Integer>() {
        public Integer call() {
            for(int i = 0; i < 1000; i++){
                System.out.println(i);
            }
            return 1;
        }
    });

現在、プロセスが終了する前にプロセスを停止しようとしていますが、使用してexSvc.shutdownNow()いますが、機能しません。

優雅に古典を止めるために、Thread私は通常、ある種の条件変数を使用します。従うべき一般的なアプローチはどれExecutorServiceですか?

4

2 に答える 2

19

Future.cancel(true)ExecutorService.shutdownNow()スレッド割り込みを使用します。タスクで中断不可能なブロッキング呼び出しを行わない限り、次のように、中断された状態を正しく処理するだけで済みます。

for(int i = 0; i < 1000; i++){
    // Uses isInterrupted() to keep interrupted status set
    if (Thread.currentThread().isInterrupted()) {
        // Cannot use InterruptedException since it's checked
        throw new RuntimeException(); 
    }
    System.out.println(i);
}

割り込み不可能なブロッキング呼び出し (ネットワーク IO など) を行う場合、事態はより複雑になります。たとえば、基礎となるソケットを閉じることによって、何らかの方法でそれらを手動で中断する必要があります。

于 2012-07-11T09:35:26.353 に答える
1

これは私が でそれを行う方法ですFixedThreadPool

    ExecutorService pool = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());

    List<Future<Void>> results = new ArrayList<>();

    for (int i = 0; i < numberOfJobs; i++) {
        MyCallableJob job = new MyCallableJob (...);
        results.add(pool.submit(job));
    }

    for (Future<Void> result : results) {
        try { result.get(); }
        catch (InterruptedException | ExecutionException ignorable) { }
    }

    pool.shutdown();
于 2012-07-11T09:34:20.597 に答える