0

我编写了一个简单的 JSF 2.0 Webapp,它收集数据,将其存储在一个 ArrayList 中,然后生成一个 JSON 文件。此过程每 n 秒执行一次。我的 webapp 有一个按钮来启动和停止这个过程。为此,我创建了一个守护线程。问题是我假设在第一次启动时守护程序没有启动。我想做的是每次启动 webapp 时检查我的守护线程是否正在运行。这样,如果我离开我的 web 应用程序并返回,它将正确地给我一个开始或停止选项。我已经用谷歌搜索了一下,但无法找到解决方案。

有没有办法检查特定线程当前是否在 JVM 中运行?

4

2 回答 2

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);
        }
    }

您的 Start/Stop 方法将从 ServletContext 获取变量并检查 isRunning 方法。然后使用 setRunning() 方法。

已编辑

你的代码应该是

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); 
}

我希望这会有所帮助。

于 2013-08-28T19:11:36.730 回答
0

如果您使用守护线程,那么它将与 JVM 一起退出。因此,如果您离开 web 应用程序,很可能整个 java 进程与线程一起终止。

好的,现在我看到您有一个服务器端 java 和一个 Web 客户端。所以你需要保留对线程的引用。也许有一个应用程序范围的 bean,它保留对您拥有的所有线程的引用。当用户登录时,您可以通过调用适当的线程方法来检查相应用户的线程是否正在运行。

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

于 2013-08-28T18:43:41.467 回答