我有一个要求,我想启动一个轮询器,它将一直运行,直到机器重新启动或进程被杀死 . 现在,我尝试使用shell脚本从主方法启动轮询器,但问题是,只要main方法完成执行,轮询器也会停止工作,因为我没有使用任何服务器来实现这一点 .
我听说过有关 daemon threads
的内容,但我想知道如何创建一个将永远运行的守护程序线程,并帮助我的轮询器也运行 .
更新:
public class SomeThread extends Thread {
@Override
public void run() {
UnitPoller unitPoller = new UnitPoller();
unitPoller.doPolling();
}
public static void main(String[] args) {
SomeThread someThread = new SomeThread();
someThread.setDaemon(true);
someThread.start();
}
}
上面是我更新的类,现在每当我从main方法执行此线程时,它都会创建一个线程但是一旦main方法的执行完成,我的poller就会停止工作,因为JVM关闭了 .
有了这个问题,我该怎么办 .
谢谢
3 回答
您只需创建一个线程并在调用
th.start()
之前调用th.setDaemon(true)
.编辑:
上面回答了问题"how to create a daemon thread",但是(因为问题的范围已经改变),一个正确的答案是:如果你希望你的线程在主线程完成后让JVM不退出,就不要创建一个守护程序线程 .
1)您需要
someThread.setDaemon(false)
而不是'true' . 一个守护程序线程实际上不会阻止java关闭 .来自javadoc:
2)我认为这不是你的主要,但你的run()方法很快就会完成 . 尝试在doPolling方法周围放置一个while(true)循环 .
3)在main中调用
join()
然后依赖守护进程线程行为更干净 .4)如果你需要一个干净的方法来关闭deamonthread . 考虑实施InterruptedException以退出轮询任务 . 您也可以使用shutdown hook .
Java中的术语"daemon thread"有点误导,因为它实际上意味着“该线程是 not 应该保持JVM活着” . 这意味着一旦最后一个非守护程序线程终止,JVM就会关闭(正如您在问题中已经说明的那样) .
您可能正在寻找的是Apache Commons Daemon项目,该项目允许创建好的"system services",通过
/etc/init.d/
条目和所有项目启动 . 这适用于Windows和* nix系统 .