2

以下の実装を使用して、Tomcatのスレッドを停止しています。コードは機能しますが、私は2つのことを疑問に思っています:

  1. MyConsumer.javaのtryステートメントにThread.sleep()を含める必要がありますか?
  2. ブールフラグをチェックする代わりにrunning、フラグの概念を削除してチェックする必要がありwhile(!Thread.currentThread().isInterrupted)ますか?

ServletContextListener:

public final class ApplicationListener implements ServletContextListener {

    private Thread thread = null;
    private MyConsumer k = null;

    public ApplicationListener() {
    }

    @Override
    public void contextInitialized(ServletContextEvent event) {

        k = new MyConsumer();
        thread = new Thread(k);

        thread.start();

    }

    @Override
    public void contextDestroyed(ServletContextEvent event) {
        if (thread != null) {
            k.terminate();
            try {
                thread.join();
            } catch (InterruptedException ex) {
                Logger.getLogger(ApplicationListener.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
}

MyConsumer.java:

public class MyConsumer implements Runnable {

    private volatile boolean running = true;

    public MyConsumer() {
    }

    public void terminate() {
        running = false;
    }

    @Override
    public void run() {

            while (running) {

                try {

                    doStuff();
                    Thread.sleep((long) 1000);

                } catch (InterruptedException ex) {
                    Logger.getLogger(MyConsumer.class.getName()).log(Level.SEVERE, null, ex);
                    running = false;
                }
            }

    }
4

2 に答える 2

3

MyConsumer.javaのtryステートメントにThread.sleep()を含める必要がありますか?

いいえ。スリープ呼び出しは、doStuff()継続的に実行されるのではなく、すべての呼び出しの間に1秒間隔で実行されるようにするためのものだと思います。この1秒の間隔が必要な場合は、スリープコールをそこに残す必要があります。doStuff()継続的に実行したい場合は、スリープを解除する必要があります。

実行中のブールフラグをチェックする代わりに、フラグの概念を削除して、while(!Thread.currentThread()。isInterrupted)をチェックする必要がありますか?

はい、それは私が実際に行うことです。これにより、フラグが不要になり、1秒後にスリープ呼び出しが戻るのを待たずに、できるだけ早くスレッドを停止できるようになります。もう1つの利点は、スレッドがdoStuff()長時間実行されているメソッドである場合に、メソッド内でスレッドが中断されているかどうかを確認できることです。

于 2013-01-31T19:53:31.043 に答える
0

中断をチェックするためだけにスレッドをスリープさせる理由はありません。代わりに、そこでThread.interupted()を呼び出すことができます。

ブールrunningフラグに関しては、InterruptedExceptionをスローするメソッドによってトリガーされないことを除いて、interruptedと同様の機能を提供します。これらの方法で通常の操作の流れを停止することが理にかなっているかどうかに応じて、どちらか一方のメカニズムを使用する必要がありますが、両方を使用することはできません。

割り込みの使用方法の概要については、http://docs.oracle.com/javase/tutorial/essential/concurrency/interrupt.htmlを参照してください。

于 2013-01-31T20:16:08.150 に答える