Вмешаться в длительную тему с contextDestroyed - PullRequest
0 голосов
/ 22 февраля 2012

Мне нужно показать код, объясняющий мою проблему.

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class ServletContextAttribListener implements ServletContextListener
{
private ServletContext context = null;
private MyThread myThread = new MyThread(true);

// This method is invoked when the Web Application
// is ready to service requests

public void contextInitialized(ServletContextEvent event)
{
    this.context = event.getServletContext();
    // Output a simple message to the server's console
    myThread.start();
    System.out.println("The Simple Web App. Is Ready");
}

public void contextDestroyed(ServletContextEvent event)
{
    // Output a simple message to the server's console
    System.out.println("The Simple Web App. Has Been Removed");
    myThread.setB(false);
    this.context = null;
}

public class MyThread extends Thread
{
    private boolean b;

    public MyThread(boolean b)
    {
        this.b = b;
    }

    @Override
    public void run()
    {
        int i = 0;
        int j = 0;
        while (b)
        {
            //This part is important
            for (i = 0; i < 1000000; i++)
            {
            }
            //
            j++;
        }
        System.out.println("Thread stopped i:->" + i + " j:->" + j);
    }

    public boolean isB()
    {
        return b;
    }

    public void setB(boolean b)
    {
        this.b = b;
    }
}
}

Как видите, это очень маленькая и пустышка.Я не писал web.xml, я просто использую класс слушателя.Когда я запускаю войну, запускаю и останавливаю tomcat, вывод программы:

The Simple Web App. Is Ready
The Simple Web App. Has Been Removed
Thread stopped i:->1000000 j:->17296

Как вы можете видеть, я равен 1000000, как в цикле for.То, что я хочу, это разорвать цикл независимо от того, равен ли я 1000000 или меньше.

Можно сказать, что я могу использовать условие b с i <1000000 </strong> дляцикл, но в моей настоящей программе у меня нет этого цикла.У меня просто есть цикл while, как здесь, но с множеством строк кода внутри.Я не хочу каждый раз проверять b .

Кстати, я не могу использовать сон / прерывание.

Ответы [ 2 ]

1 голос
/ 22 февраля 2012

Нет чистого способа остановить поток без сотрудничества с этим потоком.Поэтому, если вам нужно остановиться как можно скорее, вам придется проверять флаг остановки (b в вашем примере) как можно чаще.

Кстати, флаг b должен быть volatile, иначе ваша нить может никогда не остановиться.

0 голосов
/ 22 февраля 2012

Не забудьте присоединиться к потоку, когда контекст будет уничтожен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...