java - 如何检查我的线程是否正在运行 Java

标签 java multithreading jsf daemon

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

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

最佳答案

你的线程类

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

我希望这会有所帮助。

关于java - 如何检查我的线程是否正在运行 Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18495489/

相关文章:

java - 我可以在并行运行的多个线程中使用同一个实例吗?

java - 如何检查同一个java程序的两个实例是否正在运行?

java - 使用Gradle导入spring-integration-kafka时出错

c++ - 为什么条件变量需要锁(因此也需要互斥锁)

.net - 在非 UI 线程中创建控件

java - 提交响应后无法创建 session

jsf - 从 p :datatable via a checkbox and sending it to bean 选择多个值

jsf - 如何清除 PrimeFaces DataTable 中的全局过滤器

java stream - 字符串拆分两次后得到结果

java - NoClassDefFoundError 即使包含 .jar 文件