2013-08-28 127 views
0

我編寫了一個簡單的JSF 2.0 Web應用程序,用於收集數據,將其存儲在ArrayList中,然後生成JSON文件。該過程每n秒執行一次。我的webapp有一個按鈕來啓動和停止這個過程。爲此,我創建了一個守護進程線程。問題是我在第一次啓動時認爲守護進程沒有啓動。我想要做的是每次webapp啓動時檢查我的守護進程線程是否正在運行。這樣,如果我離開我的web應用程序並返回它將正確地給我一個開始或停止選項。我搜索了一下,一直沒有找到解決辦法。如何檢查我的線程是否正在運行Java

有沒有辦法檢查JVM當前是否運行特定的線程?

回答

2

你的線程類

public class MyDaemon implements Runnable { 
    private volatile boolean running = false; 

    public void setRunning(boolean isRunning){ 
      this.running = isRunning; 
    } 

    public boolean isRunning(){ 
      return running ; 
    } 

    public void run(){ 
      **running = true;** 
      while(running){ 
       // your code here 
      } 

    } 
} 

線程異常處理程序將在例外的情況下,變量重新

public class ThreadExceptionHandler implements Thread.UncaughtExceptionHandler { 
     private Thread thread; 

     private Throwable exception; 

     public void uncaughtException(Thread t, Throwable e) { 
      thread = t; 
      exception = e; 
      thread.setRunning(false); 
     } 
    } 

你開始/停止方法得到ServletContext的變量,並檢查isRunning方法。然後使用setRunning()方法。

EDITED

你的代碼應該是

Thread dt = (Thread)this.getServletContext().getAttribute("myDaemon"); 
if(dt != null){ 
    if (dt.isRunning()){ 
     // Running so you can only check STOP command 
     if (yourCommand == 'STOP'){ 
      dt.setRunning(false); 
     }    
    } 
    else { 
     // Not Running so check START command 
     if (yourCommand == 'START'){ 
      dt.start(); 
     } 
    } 
} 
else{ 
    // First time 
    // create exception handler for threads 
ThreadExceptionHandler threadExceptionHandler = new ThreadExceptionHandler(); 
// start Daemon thread 
Thread dThread = new Thread(new MyDaemon(), "Daemon"); 
dThread.setUncaughtExceptionHandler(threadExceptionHandler); 
dThread.setDaemon(true); 
dThread.start(); 
// now save this dThread so servlet context 
this.getServletContext().setAttribute("myDaemon", dThread); 
} 

我希望幫助。

+0

謝謝!我最終使用此代碼的修改版本來使其工作。我在我的bean中創建了這個private ServletContext servletContext =(ServletContext)FacesContext.getCurrentInstance()。getExternalContext()。getContext();那麼我能夠檢查它是否運行if(servletContext.getAttribute(「MyDaemon」)== null)...} else {//其運行} – user2229544

+0

編輯我的答案以滿足您的要求。請看一看。 – Sujoy

0

如果您使用守護進程線程,那麼它將與JVM一起退出。所以如果你離開webapp,很可能整個java進程都會和線程一起終止。

好吧,現在我看到你有一個服務器端Java和一個Web客戶端。所以你需要保持對線程的引用。也許有一個應用程序範圍的bean,它保持對所有線程的引用。當用戶登錄時,您可以通過調用適當的線程方法來檢查相應的用戶線程是否正在運行。

如果您對所有用戶只有一個線程,那麼您可以保留一個引用。那有意義嗎?

相關問題