4

javadoc で述べたように

プール内のスレッドは、明示的にシャットダウンされるまで存在します。ExecutorService#shutdown()

Tomcat に Web アプリケーションがあるとします。起動時に固定スレッドプールを作成します。私も調べました

      public  static void main(String ... strings)  {
            ExecutorService s = Executors.newFixedThreadPool(2);
            s.submit(new Runnable() {
                public void run() {
                        System.out.println("zzz");
                }
            });
      }

上記の例のスレッドは、ExecutorService に送信するまで存在しません。mainメソッドが終了すると、タスク マネージャー (win 7 os) のプロセスのリストに a が表示さjavaw.exeれます。したがって、その例を実行する jvm のインスタンスがまだ存在すると仮定します。追加するs.shutdown()と、プロセスリストにJavaプロセスがありません。

質問 1 : tomcat が何らかのエラーのために突然停止した場合、Java プロセスはメモリ内でハングします (以前にいくつかのタスクが上記のスレッド プールにサブミットされていた場合)。

質問 2 : 前の質問に対する答えが「はい」の場合、プール内のスレッドをデーモンにする方法がいくつかありますか、またはそのような tomcat/myapp 停止を処理して呼び出す方法がいくつかありますか?ExecutorService#shutdown()

4

1 に答える 1

11

質問 1: エラーが原因で tomcat が突然停止した場合、Java プロセスはメモリ内でハングしますか (以前にいくつかのタスクが上記のスレッド プールにサブミットされていた場合)。

シャットダウンしない場合はExecutorService、はい、ハングします。

質問 2: 前の質問に対する答えが「はい」の場合、プール内のスレッドをデーモンにする方法はいくつかあります...

はいあります。スレッド ファクトリを提供できます。

ExecutorService threadPool = newFixedThreadPool(numThreads,
    new ThreadFactory() {
        public Thread newThread(Runnable runnable) {
            Thread thread = Executors.defaultThreadFactory().newThread(runnable);
            thread.setDaemon(true);
            return thread;
        }
    });

@matt bが述べたように、スレッドプールが確実にシャットダウンされるようにする別のメカニズムは、 Tomcat でシャットダウンフック/リスナーを定義することです。

于 2012-09-14T13:34:01.323 に答える