让我们说这个代码在自己的线程中运行:
SomeObject someObject = new SomeObject();
someObject.doLongTask();
doLongTask()
方法可能需要很长时间才能完成。我也没有能力修改它的来源。但我希望能够终止它所做的一切,而不会杀死我的其他应用程序。如何在该方法运行时终止该方法?
答案 0 :(得分:0)
首先,我认为你应该阅读这篇文章:Why is Thread.stop() Deprecated?
因为允许线程被其他线程随意杀死可能会在多线程代码中引入许多死锁问题,而这些问题不容易被思考和提前缓解,Java开发人员决定不支持此功能。但是,有一些方法可以解决这个问题。请查看下面的代码,并了解这可能实际上并不是您问题的完整解决方案,具体取决于doLongTask()
的实施方式:
long timeout = ...//some number of milliseconds to wait
final SomeObject someObject = new SomeObject();
Thread t = new Thread(new Runnable(){
@Override
public void run(){
someObject.doLongTask();
}
});
t.join(timeout);
if(t.isAlive()){
t.interrupt();
//handle failed task here;
}
此代码假定SomeObject.doLongTask()被设计为定期查找线程中断并在检测到一个时提前终止。否则,t
将继续运行doLongTask()
,直到完成为止。如果doLongTask()
没有编码来处理线程中断并且您无法访问源代码,那么您可能会失去运气,而不是在单独的进程中运行那么长的任务。