我需要顯示一些代碼來解釋我的問題。介入一個長時間運行的線程與contextDestroyed
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,我只是使用listener-class。 當我部署戰爭,啓動和停止Tomcat,該程序的輸出是:
The Simple Web App. Is Ready
The Simple Web App. Has Been Removed
Thread stopped i:->1000000 j:->17296
正如你可以看到我1000000在for循環。我想要的是打破循環,無論我是1000000還是小於這個。
你可以說,我可以用b條件與在for循環我<百萬但在我實際的程序我沒有這樣的for循環。我只是有一個像這裏一樣的while循環,但內部有許多代碼行。我不想在每次內部檢查b。
順便說一下,我不能使用睡眠/中斷。
「衆多代碼行」需要執行多長時間?一秒?一分鐘?一小時 ? – Johannes 2012-02-22 13:44:39
最多可能需要5或6分鐘。 – GokcenG 2012-02-22 14:11:55