2011-06-27 48 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

相關問題