我有一種方法,它實際上是一個調度程序,它每隔一小時運行一個進程並每小時創建一個日誌文件。
我想在應用程序生命週期中調用一次這個方法,所以我從一個靜態塊中調用它。
但我覺得這是行不通的,因爲這個文件有時會在一小時內產生,有時甚至會產生。我聽說靜態塊只能執行一次,這是不是真的?
如果是,我應該怎麼做?方法應該在其生命週期中調用一次,並且只調用一次
回答
當類加載器加載類時,靜態初始化塊只執行一次。他們執行的時間與你的應用程序邏輯緊密相關。更精確地說,不同的類加載器可能會加載你的類,因此理論上可以執行多個靜態塊。
爲了進行調度,可以嘗試使用開箱即用的調度程序庫,例如Quartz調度程序。 (http://quartz-scheduler.org)這可能看起來是第一次開銷,但是這些庫提供了最終可能需要的高級功能。只是一個簡單的例子:如果您的程序在一個小時內停止並重新啓動,該怎麼辦?然後這個過程可能會在這個特定的小時內運行兩次。使用石英,你也可以處理這種情況。
謝謝你的Jabal的,但我用的石英schedulr,之後面臨這樣的問題:) – 2012-03-30 11:17:55
也許你應該提出關於石英問題不同的問題呢。可能你沒有正確使用,因爲它是數以百萬計的高質量產品。我很確定社區可以幫助你。 – jabal 2012-03-30 11:27:44
靜態方法並不意味着它只運行一次。靜態意味着它可以訪問外部方法而不需要實例化類的實例。
最好的解決方案關閉我的頭頂。有一個靜態變量,所以它可以與你的靜態方法一起刷新,並且一旦該方法被執行就增加該靜態變量。每次執行此方法時,檢查該變量並立即退出,如果它已經增加。
你也需要一個變量。
class ...
private static hasRun = false;
public static synchronize boolean runOnce()
{
if (hasRun) return false;
hasRun = true;
// do something
return true;
}
當沒有使用此類時,可能永遠不會調用靜態塊。
有一個關於卸載類 Unloading classes in java?
卸貨時發生的類不是多裝載有可能比靜態初始化的多個呼叫可能發生的討論。但是,在這種情況下,我的解決方案將失敗,因爲在這種情況下,任何解決方案都必須失敗
我覺得這是非常罕見的,不太可能。但是,當你不控制環境時,也許你必須要處理這個問題
- 1. 在整個應用程序生命週期中只調用一次方法
- 2. VB.NET:在應用程序的生命週期中只運行一次方法
- 3. 生命週期componentWillReceiveProps被多次調用
- 4. 被調用9次的方法,應該調用一次
- 5. PHPUnit模擬方法調用0次,而應該調用一次
- 6. 表dataSource方法在生命週期中第一次調用什麼時候?
- 7. 活動應該只調用一次
- 8. 函數應該只被調用一次
- 9. 方法一次又一次調用
- 10. 再次在活動生命週期:onStart被調用時,它不應該
- 11. Python調用__init __()方法只有一次
- 12. 方法onFocusChangeListener只調用一次
- 13. 初始方法只調用一次c#
- 14. iOS:只調用一次方法
- 15. WebSecurity.InitializeDatabaseConnection方法只能調用一次
- 16. VisualForce只調用一次getter方法
- 17. String Array只調用一次方法
- 18. 我該如何斷言一個方法只被調用一次?
- 19. 調用方法一次
- 20. 一種方法調用方法一次
- 21. 如何在 - (void)touchesMoved期間只調用一次方法?
- 22. 當它只應該被調用一次時調用多次存儲過程
- 23. 我應該多次調用dns_get_record(),還是調用一次DNS_ANY?
- 24. h:commandButton操作在兩次調用中只調用一次
- 25. 只使用ScriptManager調用JavaScript方法調用一次
- 26. Ajax調用的onclick只發生一次
- 27. setInterval的調用方法(這)調用它只有一次
- 28. window.onresize只調用一次
- 29. NavigateCommand只調用一次
- 30. requestAnimationFrame只被調用一次
您是否在使用應用程序容器?像Weblogic這樣的容器可以讓你定義啓動任務,讓你在沒有類加載器的情況下執行任務(正如jabal所說的)。 – 2012-03-30 11:22:43