2011-06-27 45 views
3

我有一个要求,我想启动一个轮询器,一直运行,直到机器重新启动或进程被杀死。现在,我尝试使用shell脚本从主方法启动轮询器,但问题是只要主方法完成执行,轮询器也停止工作,因为我没有使用任何服务器来实现此目的。如何保持我的程序活着只要一个守护进程线程正在运行?

我听说了一些关于daemon threads,但我想知道如何创建一个守护线程,它将永远运行,并帮助我的轮询器也运行。

UPDATE:

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

以上就是我更新的类,现在每当我从主方法执行此线程,它创建一个线程,但只要主要方法执行完成,我的轮询停止工作,随着JVM关闭。

有了这个问题,我该怎么做。

感谢

回答

5

您只需创建一个线程,并呼吁th.start()之前调用th.setDaemon(true)

编辑:

上述回答的问题是“如何创建一个守护线程”,而是(因为这个问题的范围发生了变化),正确的答案应该是:不创建一个守护线程如果您希望线程在主线程完成后不让JVM退出。

+1

这没有为我工作。请检查我的更新。 –

+0

@ M.J .: Thread.setDaemon()的JavaDoc说:“当只有运行的线程都是守护进程线程时,Java虚拟机退出。所以如果你的线程是一个守护进程,JVM将退出。你需要的是一个非守护线程,如果你想让JVM保持运行。 –

+2

在澄清问题后,如何删除结果不正确的部分? – oberlies

2

Java中的“守护进程线程”一词有点误导,因为它的意思是“该线程是而不是应该保持JVM活着”。这意味着只要最后一个非守护进程线程终止,JVM就会关闭(就像你在你的问题中已经提到的那样)。

您可能要找的项目是Apache Commons Daemon项目,该项目允许创建漂亮的“系统服务”,通过/etc/init.d/项和所有条目开始。这适用于Windows和* nix系统。

4

1)您需要someThread.setDaemon(false)而不是'true'。守护线程actualy不会阻止java关闭。

根据JavaDoc:

空隙java.lang.Thread.setDaemon(布尔上)

将该线程标记为守护线程或用户线程。当只有运行的线程都是守护进程线程时,Java虚拟机才会退出。

此方法必须在线程启动之前调用。

2)我认为这不是你的主,但你的run()方法很快就结束了。尝试在doPolling方法周围放置一段时间(true)循环。

@Override 
public void run() { 
    UnitPoller unitPoller = new UnitPoller(); 
    while (true) 
     unitPoller.doPolling(); 
} 

3)它是清洁打电话join()主内,然后依靠守护线程的行为。

try { 
     someThread.join(); 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

4)如果你需要一个干净的方法来关闭deamonthread。考虑实施InterruptedException以退出轮询任务。您也可以使用shutdown hook

相关问题