0

スローデーモンスレッドを読んだ後、私の要件に従って実装すると、いくつかの疑問が生じました。私を明確にしてください

  1. unitl JVM出口を実行する必要があるデーモンスレッドを呼び出すために、ServletContextListenerクラスを使用しています

    public void contextInitialized (ServletContextEvent event) {
    
         context = event.getServletContext();
         //getting from spring context
         MyServiceManager serviceManager = (MyServiceManager) ctx.getBean("myServiceManager");
         serviceManager.setDaemon(true);
         serviceManager.start();    
    }
    
  2. ServiceManagerクラスで、JVMが存在するまでプログラムfoeverを実行するために無限ループを実行しています

    public void run() {
        try {
            startService();
        } catch (Exception e) {
            logger.error("Error Occured in Background Process Runner");
        }
    }
    
    private void startService(){
        while(true){
           try{
            //invoke some new threads and do processing jobs until server/jvm stops
               }catch(Exception e) {
                //log but don't quit
               }
            }
        }
    }
    

懸念されるのは、上記の実装を使用したデーモンスレッドが実行されるかどうかです。そうでない場合、私は自分の仕事を達成するために何をすべきですか。JVMが停止しない(サーバーが停止している)場合を除いて、終了しないように指示します。

注:私はこの投稿をフォーマットするために自分のレベルを最大限に試しています。しかし、今日何かが起こっています、それはフォーマットされていません:(

4

1 に答える 1

4

デーモンスレッドは、run()メソッドが正常に終了するか、例外をスローすることによって(またはVMが終了するまで)、メソッドが終了するまで実行されます。によってスローされたすべての例外をキャッチするため、例外が返されるかスローstartService()されるまで実行され、startService()その後通常どおり終了します。

startService()I / Oの待機中、スリープ中、または待機状態で中断された場合、通常は。をスローすることに注意してくださいInterruptedException。これはスレッドに終了するように指示する通常の方法であるため、正常に動作するスレッドは通常、中断されると終了します。

スレッドをデーモンとしてマークすることは、VMがシャットダウンする前にスレッドが終了するまで待機しないことを意味するだけであることに注意してください。スレッドの終了に関する他の動作は、スレッドがデーモンであるかどうかによって影響を受けません。

于 2012-12-17T06:01:40.773 に答える