2014-10-28 62 views
1

我想設計一個系統,它將以恆定的速率生成一個特定的事件,並且這將繼續在後臺執行。在前景中,如果需要,還可以輸出其他一些事件。 但是後臺事件不會停止。在java中實現它的最好方法是什麼?Java事件生成

+0

http://en.wikipedia.org/wiki/Observer_pattern – 2014-10-28 19:48:00

+1

http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Executors.html#newScheduledThreadPool%28int%29 – 2014-10-28 19:48:32

+1

你的意思是像一個計時器? – picciano 2014-10-28 20:19:19

回答

2

這是線程的定義,它需要有一定程度的理解。

在最簡單的級別上,創建一個睡眠一段時間的線程然後執行您的代碼。還有很多其他的方法可以做到這一點,但很少有人比重寫一個線程的運行方法更短。

如果您想要更抽象的東西,請查看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()中。

我知道這很難看,而這個解決方案的醜陋之處在於爲什麼要使用線程。唯一的好處是它絕對可以防止線程衝突。

其他單線程解決方案 - 使您的代碼事件驅動 - 更加困難並嚴重影響您的代碼(有一種稱爲爲此目的而設計的有限狀態引擎)。

+0

可以在不使用線程的情況下完成嗎? – 2014-10-29 09:22:35

+0

正如我所說,你想要的是線程的定義,但你可以做到沒有線程,但它帶來了自己的一套問題 - 基本上你讓你的整個程序事件驅動,然後你的任務只是另一個事件,這是更難比線程(多),但更安全,因爲沒有併發問題 – 2014-10-29 16:14:57

+1

看看Java.util.timer - 這是一個新的線程,但應該是最簡單的實現。 http://www.tutorialspoint.com/java/util/java_util_timer.htm – 2014-10-29 16:17:05