2013-08-28 200 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,它保持对所有线程的引用。当用户登录时,您可以通过调用适当的线程方法来检查相应的用户线程是否正在运行。

如果您对所有用户只有一个线程,那么您可以保留一个引用。那有意义吗?

相关问题