Как проверить, работает ли мой поток 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-объект приложения, который хранит ссылку на все ваши потоки. Когда пользователь входит в систему, вы можете проверить, работает ли соответствующий поток пользователя, вызвав соответствующие методы потока.
Если у вас есть только один поток для всех пользователей, вы можете сохранить одну ссылку. Имеет ли это смысл?