我在查找更多關於如何限制使用ThreadPoolExecutor創建的任務的運行時間的信息。綁定線程運行時間
我想創建一個自毀的例如當時間已過(例如1米)時,線程將自動終止並返回空值。這裏的關鍵是等待線程完成不應該阻塞主線程(在我們的例子中是UI線程)。
我知道我可以使用get方法,但它會阻止我的應用程序。
我正在考慮運行一個額外的內部線程,睡眠1米,然後在主線程中調用中斷。
我附上了一個示例代碼,它看起來像個好主意,但我需要另一雙眼睛告訴我它是否合理。
public abstract class AbstractTask<T> implements Callable<T> {
private final class StopRunningThread implements Runnable {
/**
* Holds the main thread to interrupt. Cannot be null.
*/
private final Thread mMain;
public StopRunningThread(final Thread main) {
mMain = main;
}
@Override
public void run() {
try {
Thread.sleep(60 * 1000);
// Stop it.
mMain.interrupt();
} catch (final InterruptedException exception) {
// Ignore.
}
}
}
()調用通過稱爲線程池
public T call() {
try {
// Before running any task initialize the result so that the user
// won't
// think he/she has something.
mResult = null;
mException = null;
// Stop running thread.
mStopThread = new Thread(new StopRunningThread(
Thread.currentThread()));
mStopThread.start();
mResult = execute(); <-- A subclass implements this one
} catch (final Exception e) {
// An error occurred, ignore any result.
mResult = null;
mException = e;
// Log it.
Ln.e(e);
}
// In case it's out of memory do a special catch.
catch (final OutOfMemoryError e) {
// An error occurred, ignore any result.
mResult = null;
mException = new UncheckedException(e);
// Log it.
Ln.e(e);
} finally {
// Stop counting.
mStopThread.interrupt();
}
return mResult;
}
有幾個點,我有點害怕:
- 如果執行(會發生什麼)有異常之後我的外線會中斷,那麼我就永遠不會發現異常。
- 內存/ CPU消耗,我正在使用線程池來避免創建新線程。
您是否看到了達到相同功能的更好主意?
當然要注意,提交給該池的所有任務都有相同的超時時間。但是,只有1個額外的線程被創建(這並不是很多),並且從用戶的角度來看,他們仍然只能看到一個ExecutorService。他們不必改變他們提交的Callable。 – Matt
看起來像一個很好的解決方案。關於最後的意見,從javadoc我可以看到isInterrupted()[清除](http://stackoverflow.com/questions/9901649/after-catching-interruptedexception-why-thread-currentthread-中斷),當拋出異常,所以檢查它不會真的有幫助,我是對的嗎? –
另一個快速問題是,線程池中的線程會中斷嗎?在處理中斷線程的Java源代碼中看不到任何東西 –