我写了一个简单的JSF 2.0 Webapp,它收集数据,将其存储在ArrayList中,然后生成一个JSON文件。此过程每n秒执行一次。我的webapp有一个启动和停止此过程的按钮。为此,我创建了一个守护程序线程。问题是我首先假设守护程序未启动。我想要做的是每次启动webapp时检查我的守护程序线程是否正在运行。这样,如果我离开我的webapp并返回它将正确地给我一个开始或停止选项。我已经google了一下,但是找不到解决办法。
有没有办法检查特定线程当前是否在JVM中运行?
答案 0 :(得分: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()方法。
<强> 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);
}
我希望有所帮助。
答案 1 :(得分:0)
如果您使用守护程序线程,那么它将与JVM一起退出。因此,如果您离开webapp,很可能整个java进程与线程一起终止。
好的,现在我看到你有一个服务器端java和一个Web客户端。所以你需要保持对线程的引用。也许有一个应用程序作用域bean,它保存对你拥有的所有线程的引用。当用户登录时,您可以通过调用适当的线程方法来检查相应用户的线程是否正在运行。
如果所有用户只有一个线程,那么您可以保留一个引用。这有意义吗?