我想強制方法運行指定的時間。在指定的時間間隔內運行強制方法
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;
}
這樣做的最好方法是什麼?謝謝!
我想強制方法運行指定的時間。在指定的時間間隔內運行強制方法
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;
}
這樣做的最好方法是什麼?謝謝!
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秒內完成。這樣在每個塊的末尾可以檢查時間是否已過。
如果您的工作涉及可能無限期阻塞的I/O工作,請嘗試使用可中斷方法(可通過致電Thread.interrupt()
中斷)或接受來自呼叫者的明確最長運行時間的方法。
或者您可以將I/O工作委託給某個專用線程,並在單獨的線程中檢查其進度,並在超出運行時間時採取適當的行動。
如果在一些塊執行函數「掛起」時該怎麼辦? – Martin
@Martin我認爲沒有任何可以「掛起」的步驟,具有任何合理的可能性。如果有這樣的步驟,例如網絡I/O,則使用一個線程用於I/O等,以便根據需要儘快檢查I/O進度並中止I/O。 –
嘗試使用此:
poolExecutor = new ScheduledThreadPoolExecutor(1);
poolExecutor.scheduleAtFixedRate(
new YourRunable(), startFrom/*10*/, startEvery/*5*/, TimeUnit.SECONDS);
是的,就是這樣。我正是這個意思! – SHiRKiT
這並沒有強制runnable最多運行X秒 - 它的目的是在N秒內啓動runnable,並且每M秒重新調用一次 –
你可以開始一個新的線程,只有調用你的方法,並把它睡覺你創建一個定時器超時後。這種方式雖然你不能保證方法週期在暫停前已經完成,但是不需要修改方法就可以實現。爲了實現循環,只需將這個睡眠邏輯置於線程的循環中即可。只記得喚醒線程
可能有幾十個實現,因爲你沒有足夠清楚地解釋。
實現一個加快循環? http://thedailywtf.com/Articles/The-Speedup-Loop.aspx –
「指定時間間隔內運行」是什麼意思?它應該在這段時間內完成嗎?只有在這段時間後才返回?在這段時間內被連續調用? –
你在這裏使用「在...期間」這個詞非常混亂。 –