在java中,如何停止第三方方法?

在java中,如何停止第三方方法?,java,methods,terminate,Java,Methods,Terminate,假设我的代码在自己的线程中运行: SomeObject someObject = new SomeObject(); someObject.doLongTask(); 该doLongTask()方法可能需要很长时间才能完成。我也没有能力修改它的源代码。但我希望能够终止它正在执行的任何操作,而不会终止应用程序的其余部分。如何在该方法运行时终止它?首先,我认为您应该阅读本文: 由于允许其他线程随意终止线程会在多线程代码中引入许多死锁问题,这些问题不容易提前考虑和缓解,因此Java开发人员决定不支持

假设我的代码在自己的线程中运行:

SomeObject someObject = new SomeObject();
someObject.doLongTask();

doLongTask()
方法可能需要很长时间才能完成。我也没有能力修改它的源代码。但我希望能够终止它正在执行的任何操作,而不会终止应用程序的其余部分。如何在该方法运行时终止它?

首先,我认为您应该阅读本文:

由于允许其他线程随意终止线程会在多线程代码中引入许多死锁问题,这些问题不容易提前考虑和缓解,因此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()
没有编码来处理线程中断,并且您没有访问源代码的权限,那么您可能运气不佳,无法在单独的进程中运行长任务。

首先,我认为您应该阅读这篇文章:

由于允许其他线程随意终止线程会在多线程代码中引入许多死锁问题,这些问题不容易提前考虑和缓解,因此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()
没有编码来处理线程中断,并且您没有访问源代码的权限,那么您可能运气不佳,无法在单独的进程中运行该长任务。

请参阅:请参阅: