2

我正在使用以下实现来停止 Tomcat 中的线程。该代码有效,但我想知道两件事:

  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()

不,我认为 sleep 调用是为了确保doStuff()在每次调用之间以 1 秒的间隔执行,而不是连续执行。如果你想要这个 1 秒的间隔,你需要把睡眠电话留在那里。如果要doStuff()连续执行,则需要解除休眠。

我应该删除标志的概念并只检查while(!Thread.currentThread().isInterrupted),而不是检查我的布尔标志,运行吗?

是的,我确实会这样做。它将消除对标志的需要,并允许尽快停止线程,而不必等待睡眠调用在 1 秒后返回。另一个优点是您可以检查线程是否在doStuff()方法内部被中断,以防它是您想要尽快停止的长时间运行的方法。

于 2013-01-31T19:53:31.043 回答
0

您的线程没有理由只是为了检查中断而休眠。您可以在那里调用 Thread.interupted() 。

关于布尔running标志,它提供了与中断类似的功能,只是它不是由抛出 InterruptedException 的方法触发。根据在这些方法中停止正常操作流程是否有意义,您应该使用一种或另一种机制,但不能同时使用两者。

请参阅http://docs.oracle.com/javase/tutorial/essential/concurrency/interrupt.html了解如何使用中断的一个很好的概述。

于 2013-01-31T20:16:08.150 回答