Как проверить, работает ли мой поток Java

Я написал простое веб-приложение JSF 2.0, которое собирает данные, сохраняет их в ArrayList, а затем генерирует файл JSON. Этот процесс выполняется каждые n секунд. В моем веб-приложении есть кнопка для запуска и остановки этого процесса. Для этого я создал поток демона. Проблема в том, что при первом запуске я предполагаю, что демон не запущен. Я хотел бы, чтобы каждый раз, когда запускалось веб-приложение, проверялось, работает ли мой поток демонов или нет. Таким образом, если я откажусь от своего веб-приложения и вернусь, это правильно даст мне возможность начать или остановить. Я немного погуглил и не смог найти решение для этого.

Есть ли способ проверить, работает ли определенный поток в 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);
        }
    }

Ваш метод 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); 
}

Надеюсь, это поможет.

Если вы используете поток демона, он завершится с JVM. Поэтому, если вы выходите из веб-приложения, скорее всего весь процесс Java завершается вместе с потоком.

Хорошо, теперь я вижу, что у вас есть серверная часть Java и веб-клиент. Так что вам нужно сохранить ссылку на ветку. Возможно, имейте bean-объект приложения, который хранит ссылку на все ваши потоки. Когда пользователь входит в систему, вы можете проверить, работает ли соответствующий поток пользователя, вызвав соответствующие методы потока.

Если у вас есть только один поток для всех пользователей, вы можете сохранить одну ссылку. Имеет ли это смысл?

Другие вопросы по тегам