2011-10-26 52 views
5

我想強制方法運行指定的時間。在指定的時間間隔內運行強制方法

public Response run(Request req){ 
    //method runImpl must run during specified interval of time(for example for 10 secs) 
    Response res = runImpl(req); 
    return response; 
    } 

這樣做的最好方法是什麼?謝謝!

+1

實現一個加快循環? http://thedailywtf.com/Articles/The-Speedup-Loop.aspx –

+1

「指定時間間隔內運行」是什麼意思?它應該在這段時間內完成嗎?只有在這段時間後才返回?在這段時間內被連續調用? –

+3

你在這裏使用「在...期間」這個詞非常混亂。 –

回答

2

runImpl應該返回一個布爾值來使此代碼正常工作。如果你不希望你的程序停滯不前,你可能會想要一個新的線程(基本教程比比皆是)。

public Response run(Request req){ 
long lasttime=Sys.getTime(); 
int i=0; 
while(i<10){ 
    if(Response res = runImpl(req);){ 
    return response; 
    } 
    if((Sys.getTime-lasttime)>1000){ 
    i++; 
    lasttime=Sys.getTime(); 
    } 
} 
return null; 

這運行的每個處理器的時刻,如果你想讓它在某個區間運行以及運行10秒,使用:

public Response run(Request req){ 
long lasttime=Sys.getTime(); 
int i=0; 
for(int i; i<(10000/yourchoiceinterval); i++){ 
    if(Response res = runImpl(req);){ 
    return response; 
    } 
    if((Sys.getTime-lasttime)>1000){ 
    lasttime=Sys.getTime(); 
    } 
} 
return null; 
1

最好的方法是讓你的工作適合大小的塊,因此每塊可以在1秒內完成。這樣在每個塊的末尾可以檢查時間是否已過。

如果您的工作涉及可能無限期阻塞的I/O工作,請嘗試使用可中斷方法(可通過致電Thread.interrupt()中斷)或接受來自呼叫者的明確最長運行時間的方法。
或者您可以將I/O工作委託給某個專用線程,並在單獨的線程中檢查其進度,並在超出運行時間時採取適當的行動。

+0

如果在一些塊執行函數「掛起」時該怎麼辦? – Martin

+0

@Martin我認爲沒有任何可以「掛起」的步驟,具有任何合理的可能性。如果有這樣的步驟,例如網絡I/O,則使用一個線程用於I/O等,以便根據需要儘快檢查I/O進度並中止I/O。 –

3

嘗試使用此:

poolExecutor = new ScheduledThreadPoolExecutor(1); 
poolExecutor.scheduleAtFixedRate(
     new YourRunable(), startFrom/*10*/, startEvery/*5*/, TimeUnit.SECONDS); 
+0

是的,就是這樣。我正是這個意思! – SHiRKiT

+0

這並沒有強制runnable最多運行X秒 - 它的目的是在N秒內啓動runnable,並且每M秒重新調用一次 –

0

你可以開始一個新的線程,只有調用你的方法,並把它睡覺你創建一個定時器超時後。這種方式雖然你不能保證方法週期在暫停前已經完成,但是不需要修改方法就可以實現。爲了實現循環,只需將這個睡眠邏輯置於線程的循環中即可。只記得喚醒線程

可能有幾十個實現,因爲你沒有足夠清楚地解釋。

相關問題