2012-02-22 51 views
0

我需要顯示一些代碼來解釋我的問題。介入一個長時間運行的線程與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

順便說一下,我不能使用睡眠/中斷。

+0

「衆多代碼行」需要執行多長時間?一秒?一分鐘?一小時 ? – Johannes 2012-02-22 13:44:39

+0

最多可能需要5或6分鐘。 – GokcenG 2012-02-22 14:11:55

回答

1

沒有這個線程的協作,沒有乾淨的方法來阻止線程。所以,如果您需要儘快停止,您必須儘可能頻繁地檢查停止標誌(在您的示例中爲b)。

順便說一句,b標誌應該是volatile,否則你的線程可能永遠不會停止。

+0

是的,你的關於易變點是正確的。如果你這麼說線程生命週期,那麼我需要在while循環中檢查b很多次。 – GokcenG 2012-02-22 14:13:21

0

當上下文被破壞時,不要忘記加入線程。