2015-06-09 56 views
1

我想中断长时间工作的线程。在我的例子里面run()方法出现很多不同的方法,需要花费很多时间(例如写入数据库)。我想停止(杀死)另一个线程。我看到的解决方案,如:中断长工作线程

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(); 
       } 
      }} 
+0

您似乎已经知道您需要做什么。您尚未发布任何自己的代码,因此很难明白您为什么期待我们。 –

+0

如果你想从另一个线程调用'thread.interrupt()'来杀死一个线程,其中'thread'是一个长工作线程。不要使用Thread.currentThread()。interrupt();'这就像打断你自己。 – Codebender

+0

@AbishekManoharan,OP从不建议中断当前线程。我想你误解了这个问题。 – aioobe

回答

4

如果长时间运行的数据库调用不响应中断,那么你基本上是出于运气,以及需要采取的解决方法,如果你的实例需要一个响应式用户界面。

的一种方式是运行在后台线程的数据库的方法和定期检查在主线程停止早条件(如中断)。当发现这种情况时,您只需放弃后台线程并忽略它的未来结果。

如果可能的话,你可以尝试在长时间运行的任务分成多个小任务,并为您在之间中断。

(有些人可能会指出你Thread.stop,但这种方法已被弃用for very good reasons

正式文件(这部分回答您张贴过的问题):

Why Are Thread.stop, Thread.suspend, Thread.resume and Runtime.runFinalizersOnExit Deprecated?


关于你的代码。

如果//do sth是一个长期运行的任务,是从来没有执行Thread.currentThread().isInterrupted()==true检查。

我复制你的程序并在本地执行它,被我印了"Parsing ABORTED"

+0

我不明白,如何添加'索引++'应该有所作为。无论是否存在索引++',都会执行包含检查的循环体。缺少'index ++'会使循环无限,但不会改变中断行为。 – Holger

+0

嗯。你是绝对正确的。我认为这是一个不可达的问题,但显然不是。从我的答案中删除这个。 – aioobe

0

你混淆了两个完全不同的东西。含像Thread.currentThread().interrupt()语句代码片段作为所述语句是恢复中断状态,使主叫方可以处理它处理中断。

既然你想处理打断,那不是正确的。如果你检测到中断,你只需要一个简单的语句告诉编译器该做什么。所以,如果你想你的任务是在中断时返回,只是用作为

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

一般为简单的声明,不从别的,其目的你不明白的地方复制代码。

+0

但正如我提到的问题是检测下面的代码中的isInterrupted()内循环。 – PatLas

+1

添加'else'语句来检查您是否遇到该检查。如果您的代码在其他地方被阻止,该检查无法帮助。如果检查被执行,但评估结果为“假”,那么你没有中断线程,但可能是其他线程...... – Holger