Java 中断长工作线程

Java 中断长工作线程,java,multithreading,concurrency,interrupt,Java,Multithreading,Concurrency,Interrupt,我试图中断长时间工作的线程。在我的示例中,内部运行方法出现了许多不同的方法,需要花费相当多的时间,例如写入数据库。我想停止从另一个线程杀死该线程。我见过这样的解决方案: while(!Thread.currentThread().isInterrupted()){ try{ // do stuff }catch(InterruptedException e){ Thread.currentThread().interrupt(); // propa

我试图中断长时间工作的线程。在我的示例中,内部运行方法出现了许多不同的方法,需要花费相当多的时间,例如写入数据库。我想停止从另一个线程杀死该线程。我见过这样的解决方案:

while(!Thread.currentThread().isInterrupted()){
    try{
        // do stuff
    }catch(InterruptedException e){
        Thread.currentThread().interrupt(); // propagate interrupt
    }
}
但我的代码中没有while循环。有人能帮我解决这个问题吗

代码如下:

public void run() //parsingThread
    {
        try {
            for(int index=0; index<tasks.size();)
            { //do sth
                if(Thread.currentThread().isInterrupted()==true)
                {       
                    System.out.println("Parsing ABORTED");
                    Thread.currentThread().interrupt();             
                }               
            }


            for(int index=0; index<1000;index++)
            {   //do sth  
                if(Thread.currentThread().isInterrupted()==true)
                {
                    System.out.println("Parsing ABORTED");
                    Thread.currentThread().interrupt();
                }
            }}

如果长时间运行的数据库调用对中断没有响应,那么基本上就是运气不好,如果您想要一个响应性强的用户界面,就需要求助于变通方法

一种方法是在后台线程中运行数据库方法,并定期检查主线程中的中断等早期停止情况。当发现这种情况时,您只需放弃后台线程,并忽略它将来的任何结果

如果可能,您可以尝试将长时间运行的任务拆分为多个较小的任务,并检查其间是否有中断

有些人可能会向您指出,但该方法已被弃用

官方文件部分回答了您发布的问题:

关于你的代码

如果//do sth是一个长时间运行的任务,则永远不会执行Thread.currentThread.isInterrupted==true检查


我已经复制了您的程序并在本地执行了它,正在为我打印解析中止。

如果您的长时间运行的数据库调用没有响应中断,那么您基本上是运气不佳,如果您想要一个响应的用户界面,就需要求助于变通方法

一种方法是在后台线程中运行数据库方法,并定期检查主线程中的中断等早期停止情况。当发现这种情况时,您只需放弃后台线程,并忽略它将来的任何结果

如果可能,您可以尝试将长时间运行的任务拆分为多个较小的任务,并检查其间是否有中断

有些人可能会向您指出,但该方法已被弃用

官方文件部分回答了您发布的问题:

关于你的代码

如果//do sth是一个长时间运行的任务,则永远不会执行Thread.currentThread.isInterrupted==true检查


我已经复制了您的程序并在本地执行,正在为我打印解析中止。

您混淆了两个完全不同的东西。包含诸如Thread.currentThread.interrupt之类语句的代码片段不会处理中断,因为所述语句用于恢复中断状态,以便调用方可以处理它

既然你想处理干扰,那就不是正确的做法。如果检测到中断,只需要一条简单的语句告诉编译器该做什么。因此,如果您希望任务在中断时返回,只需使用如下简单语句

if(Thread.currentThread().isInterrupted()) {
    // if you need cleanup, do it here
    return;
}

一般来说,不要从你不了解其用途的其他地方复制代码。

你把两种完全不同的东西混在了一起。包含诸如Thread.currentThread.interrupt之类语句的代码片段不会处理中断,因为所述语句用于恢复中断状态,以便调用方可以处理它

既然你想处理干扰,那就不是正确的做法。如果检测到中断,只需要一条简单的语句告诉编译器该做什么。因此,如果您希望任务在中断时返回,只需使用如下简单语句

if(Thread.currentThread().isInterrupted()) {
    // if you need cleanup, do it here
    return;
}

一般来说,不要从其他你不了解目的的地方复制代码。

你似乎已经知道你需要做什么了。您还没有发布任何自己的代码,因此很难理解您为什么期待我们的帮助。如果您想从另一个线程中终止一个线程,请调用thread.interrupt,其中thread是长工作线程。不要使用Thread.currentThread.interrupt;这就像打断你自己一样。@Abishecmanoharan,OP从未建议中断当前线程。我认为你误读了这个问题。一般来说,把try/catch放在while循环的周围,而不是放在它里面,是一个很好的实践。这样,中断将自动终止循环。@HoboSapiens我在下面的帖子中插入了代码。你似乎已经知道你需要做什么了。您还没有发布任何自己的代码,因此很难理解您为什么期待我们的帮助。如果您想从另一个线程中终止一个线程,请调用thread.interrupt,其中thread是长工作线程。不要使用Thread.currentThread.interrupt;这就像打断你自己一样。@Abishecmanoharan,OP从未建议中断当前线程。我认为你误读了这个问题。一般来说,把try/catch放在while循环的周围,而不是放在它里面,是一个很好的实践。这样,中断将自动终止循环。@Hobo Sapiens我在下面的帖子中插入了代码。但正如我所提到的,问题是在下面的代码中检测循环内部是否中断。添加一个
else语句来检查您是否遇到了检查。如果您的代码在其他地方被阻止,那么检查将无济于事。如果执行了检查,但计算结果为false,那么您没有中断线程,但可能是其他线程…但正如我所提到的,问题是在下面的代码中检测到isInterrupted inside loop。添加else语句以检查是否遇到检查。如果您的代码在其他地方被阻止,那么检查将无济于事。如果执行了检查,但计算结果为false,那么您没有中断该线程,但可能是其他线程…我不明白,添加index++应该有什么不同。将执行包含检查的循环体,而不管是否存在index++。缺少index++会使循环无限,但不会改变中断行为。你完全正确。我认为这是一个无法达到的问题,但显然不是。从我的答案中删除这个。我不明白,添加索引++应该有什么不同。将执行包含检查的循环体,而不管是否存在index++。缺少index++会使循环无限,但不会改变中断行为。你完全正确。我认为这是一个无法达到的问题,但显然不是。从我的答案中删除这个。