1

このクラスは、呼び出された ExecutorService.shutdownNow() を実行した後、Future.get() メソッドでハングします。何を間違えているのかわかりません。

このクラスは固定スレッド プールを作成し、5 秒後にタイムアウトします。エラーが 5 回連続して発生した場合、shutdownNow() が呼び出されます。

 public class TestExecutor {

private AtomicInteger mThresholdCount = new AtomicInteger();
// Default error threshold limit
private int mThresholdLimit = 5;

private ExecutorService executor;

private ThreadPool pool;

public TestExecutor() {
    option2();
}   

private void option2() {
    executor = Executors.newFixedThreadPool(2);
    Collection<Future<String>> runnableList = new ArrayList<Future<String>>();
    for (int count = 0; count <= 10; count++) {
        MyCallable runnable = new MyCallable(count);
        runnableList.add(executor.submit(runnable));
    }
    for (Future<String> future : runnableList) {
        try {
            System.out.println("Before Get");
            future.get();
            System.out.println("After Get");
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    executor.shutdown();
}   

public static void main(String[] args) {
    new TestExecutor();
}

private class TimeOutTask extends TimerTask {
    private Thread t;

    public TimeOutTask(Thread t) {
        this.t = t;
    }

    public void run() {
        if (t != null && t.isAlive()) {
            t.interrupt();
        }
    }
}

private class MyCallable implements Callable<String> {

    private int count = 0;
    private Timer timer = new Timer(true);

    public MyCallable(int count) {
        this.count = count;
    }

    @Override
    public String call() {
        try {
            System.out.println("Started Processing " + count);
            timer.schedule(new TimeOutTask(Thread.currentThread()), 5000);
            Thread.sleep(100000);
            System.out.println("Completed processing " + count);
        } catch (Exception e) {
            System.out.println("Error while processing:" + count);
            if (mThresholdCount.incrementAndGet() == mThresholdLimit) {
                System.out.println("while processing:" + count
                        + " Reached maximum error threshold limit! "
                        + "Requested to stop the process.");
                if (executor != null) {
                    executor.shutdownNow();
                    System.out.println("Shut down now");
                }

            }
        }
        return String.valueOf(count);
    }
}

}

5 つのスレッドが連続して中断され、shutdownNow() が呼び出された後、get() がここでハングする理由を理解してください。

4

1 に答える 1

2

リストの最後にあるCallablesが実際に実行されることはなく、したがって完了することもありません(2つのスレッドと10のタスクがあります)。shutdownNow()このメソッドは、実行されない実行可能ファイルのリストを返すことに気付くでしょう。あなたはおそらくそれらで何か意味のあることをするべきです。

于 2012-06-12T18:33:15.533 に答える