4

で使用しようとしてExecutorServiceBlockingQueue<Runnable>ますが、スクリプトを終了するときに問題が発生します。問題なく終了しますが、何がわからないので待ち続けます。

まず第一に私はクラスを持っています

public class GenericTask implements Runnable {
    public void run() {
        // do stuff
    }
}

次に、これはコードです

BlockingQueue<Runnable> queue = new ArrayBlockingQueue<Runnable>(10000, true);
ExecutorService myExecutor = Executors.newFixedThreadPool(numThreads);

new Thread(new Runnable() {
    public void run() {
        for (; ; ) {
            try {
                myExecutor.execute(queue.take());
            } catch (InterruptedException ignored) {
            }
        }
    }
}).start();

while (...) {
    queue.put(new GenericTask());
}

int waitTime = 500;
myExecutor.shutdown();
try {
    while (!myExecutor.awaitTermination(waitTime, TimeUnit.MILLISECONDS)) {
        logger.info("Waiting...");
        Thread.sleep(waitTime);
    }
} catch (Exception e) {
    e.printStackTrace();
}

System.out.println("Finished!");

「Finished!」と表示されると、実際に完成していますが、を追加しない限りスクリプトは続行されますが、System.exit(0)これは正しくないと思います。

4

1 に答える 1

4

最後に、スレッド プール内のすべてのスレッドを正しくシャットダウンしています。しかし、JVM の終了を阻止する別の非デーモン スレッドがあります。あなたはそれを見つけることができますか?内部に無限ループがある匿名プロデューサー スレッドです: for (;;)

使用Thread.setDaemon(true):

Thread t = new Thread(new Runnable() {
  //...
});
t.setDaemon(true);
t.start();

ExecutorServiceシャットダウン後にすべてのスレッドが終了すると、mainスレッドも終了し、残っているスレッドはデーモンだけであるため、JVM が停止します。

于 2013-01-11T21:59:48.150 に答える