我正在使用單線程ScheduledExecutorService
來處理一些Runnable
任務。當我的Runnable
完成其工作時,它會在ScheduledExecutorService
中重新安排自己的延遲時間。這種情況無限期發生,直到Runnable
獲得Exception
。關閉運行任務中的ExecutorService
public class Runner {
ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
public void startWorking() {
// Single-shot start
service.submit(new Task(service));
}
public void stopWorking() {
service.shutDown();
// Do some other stuff
}
private static final class Task implements Runnable {
ScheduledExecutorService service;
private Task(ScheduledExecutorService service) {
this.service = service;
}
@Override
public void run() {
try {
// Do some work...
service.schedule(this, variableDelay, TimeUnit.SECONDS);
}
catch(SomethingHappenedException e){
// Shutdown service
}
}
}
}
我可以shutdown()
或shutdownNow()
的ExecutorService
安全地從Task.run()
?如果線程會引發自身的中斷,那麼某些東西看起來不正確。
當執行Task
時發生異常時,我想shutdown
service
,理想情況下調用Runner.stopWorking()
。
我知道我可以使用一個Callable
,而不是讓Runner
管理的重新安排,但我想保持這種結構(Runner
將有更多類似的service
S,這樣無限循環只是看起來不正確的存在)。
我想我可以繼承ScheduledThreadPoolExecutor
覆蓋afterExecute
並處理關機,使用對Runner
的引用。
public class Runner {
ScheduledExecutorService service = new ScheduledThreadPoolExecutor(1){
protected void afterExecute(Runnable r, Throwable t) {
if (t != null) {
Runner.this.stopWorking();
}
};
// ...
}
我的這種做法值得關注的是,如果afterExecute
將由跑Task
,這將具有相同的效果,從Task.run()
本身調用shutDown()
線程調用。
有沒有其他的替代方法呢?
看起來像調用'shutdown()'或甚至'shutdownNow()'從任務本身是安全的,並且正常工作。如果確實如此,這個問題的答案是微不足道的。 –