2014-12-06 65 views
2

我的問題的一般情況是,我們如何檢測一個特定的函數調用是否花了太長時間,以致於我們想要終止它?如何限制線程的執行時間並在運行時間過長時終止它?

在我的頭頂,我認爲使用一個線程來運行該功能,並殺死線程,如果它運行太長的定義如下:

class MyThread extends Thread 
{ 
    public void run() 
    { 
    someFunction(); 
    } 
} 

並說someFunction可能是:

public void someFunction() 
{ 
    // Unknown code that could take arbitrarily long time. 
} 

在上面的代碼中,someFunction()可能沒有時間完成,或者需要花費很長時間,所以說我想在耗時過長時停止它。

然而,在Java線程的實現,顯然我不能使用共享變量或時間戳的線程中,這樣的線程將有時間觀念,因爲someFunction()玩意兒原子和這樣的檢查對時間戳碼只能在someFunction之後去,因此在編碼被執行的時候變得沒用,一些功能已經完成了。

請注意,我也想這樣做,someFunction()是不可知的。也就是說,someFunction()不應該 擔心它運行多少時間。它根本不應該意識到它。

任何人都可以提供一些見解我如何完成此功能?

+0

你說的是死鎖嗎?我不指望人們像上面那樣編碼。給我們確切的場景。 – SMA 2014-12-06 07:04:06

+0

@almasshaikh沒有關於鎖。我只是問,如果我想確保一條線不會運行太久,否則我們會殺死它,我們應該怎麼做? – OneZero 2014-12-06 07:05:11

+0

使用另一個計劃的線程,該線程在您的線程以線程引用啓動後運行,並在一小時後喚醒,如果它仍然運行中斷它(只要您的線程響應中斷)。 – SMA 2014-12-06 07:07:38

回答

2

我會使用ExecutorService來運行線程。然後我會收到一個Future並使用get()超時取消它。

ExecutorService es = Executors.newFixedThreadPool(1); // You only asked for 1 thread 
Future<?> future = es.submit(new Mythread()); 
try { 
    future.get(timeout, TimeUnit.SECONDS); // This waits timeout seconds; returns null 
} catch(TimeoutException e) { 
    future.cancel(true); 
} 
+0

雖然 – NilsH 2014-12-06 15:21:50

+1

'future.cancel(true)'將會無用,除非該函數被寫入正確處理(不只是捕獲)InterruptedExceptions和中斷。 – VGR 2014-12-06 20:14:42

+0

說有2個線程。說,我希望每個線程單獨不超過10秒。說第一個線程需要10秒,第一個將來。get()將等待10s。說第二個線程仍然在運行,第二個線程的future.get()會等待另外10個線程,然後等待20個線程。如何避免這種情況? – user104309 2017-11-07 14:49:24