このクラスは、呼び出された 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() がここでハングする理由を理解してください。