我想設計一個系統,它將以恆定的速率生成一個特定的事件,並且這將繼續在後臺執行。在前景中,如果需要,還可以輸出其他一些事件。 但是後臺事件不會停止。在java中實現它的最好方法是什麼?Java事件生成
Java事件生成
回答
這是線程的定義,它需要有一定程度的理解。
在最簡單的級別上,創建一個睡眠一段時間的線程然後執行您的代碼。還有很多其他的方法可以做到這一點,但很少有人比重寫一個線程的運行方法更短。
如果您想要更抽象的東西,請查看Java文檔中的併發包,有許多方法可以完全按照您的需要進行,java.util.timer也是一個很好的方法。
請注意不同線程可能同時訪問的變量和集合。另外請注意,如果你有一個GUI,你不會從這個新線程更新你的GUI。
編輯添加非線程解決方案
(我不認爲這真的是你想要的,但在評論你問一個非螺紋解決方案)。
如果您希望在沒有線程的情況下執行此操作(意思是說您確實希望在當前線程中執行此操作),則必須偶爾「中斷」當前線程以檢查其他任務是否需要處理。首先,你需要這樣的方法:
long lastRun=System.currentTimeInMillis();
final long howOftenToRun=60*1000 // every minute
testForBackgroundTask() {
if(lastRun + howOftenToRun < System.currentTimeInMillis()) {
// This will drift, if you don't want drift use lastRun+=howOftenToRun
lastRun=System.currentTimeInMillis()
// this is where your occasional task is.
// The task could be in-line here but of course that would violate the SRP
runBackgroundTask()
}
}
之後,你需要撒testForBackgroundTask整個代碼:
lotsOfStuff....
testForBackgroundTask()
longMethod()
testForBackgroundTask()
morestuff...
testForBackgroundTask()
...
注意,如果longMethod()需要很長的時間,那麼你就需要把調用放到它裏面的testForBackgroundTask()中。
我知道這很難看,而這個解決方案的醜陋之處在於爲什麼要使用線程。唯一的好處是它絕對可以防止線程衝突。
其他單線程解決方案 - 使您的代碼事件驅動 - 更加困難並嚴重影響您的代碼(有一種稱爲爲此目的而設計的有限狀態引擎)。
可以在不使用線程的情況下完成嗎? – 2014-10-29 09:22:35
正如我所說,你想要的是線程的定義,但你可以做到沒有線程,但它帶來了自己的一套問題 - 基本上你讓你的整個程序事件驅動,然後你的任務只是另一個事件,這是更難比線程(多),但更安全,因爲沒有併發問題 – 2014-10-29 16:14:57
看看Java.util.timer - 這是一個新的線程,但應該是最簡單的實現。 http://www.tutorialspoint.com/java/util/java_util_timer.htm – 2014-10-29 16:17:05
- 1. 生成事件
- 2. 生成事件Swing
- 3. Esper生成事件
- 4. Visual Studio預生成事件/生成後事件工作目錄
- 5. 在Java中實現事件生成器成語
- 6. 如何生成'enter'事件?
- 7. 生成後退鍵事件
- 8. VS後生成事件
- 9. 唯一事件ID生成
- 10. 生成後事件中CruiseControl.Net
- 11. 生成客戶端事件
- 12. Html DropDownList不生成事件
- 13. 如何生成事件
- 14. ASP.net事件不生成
- 15. 生成雙擊事件Android
- 16. VS後生成事件
- 17. 在MFC中生成事件
- 18. 生成事件/ C/Python的
- 19. Java線程完成事件
- 20. 生成文件的Java
- 21. 生成java JNLP文件?
- 22. 爲Java/Linux生成文件
- 23. Java生成軟件配置
- 24. java生成文件問題
- 25. 用java生成AutoCAD文件?
- 26. 從java文件生成JSON
- 27. 以Java生成XSD文件
- 28. 生成的Java Swing雙擊鼠標事件
- 29. Java:如何從套接字readline()生成一個事件?
- 30. Java WatchService在觀看映射驅動器時不生成事件
http://en.wikipedia.org/wiki/Observer_pattern – 2014-10-28 19:48:00
http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Executors.html#newScheduledThreadPool%28int%29 – 2014-10-28 19:48:32
你的意思是像一個計時器? – picciano 2014-10-28 20:19:19