中断长工作线程

时间:2015-06-09 08:50:36

标签: java multithreading concurrency interrupt

我正在尝试中断长时间工作的线程。在我的例子中,run()方法出现了很多不同的方法,需要花费很多时间(例如写入数据库)。我想停止(杀死)另一个线程。我见过像这样的解决方案:

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

但我的代码中没有while循环。任何人都可以帮我解决这个问题吗?

以下是代码:

{{1}}

2 个答案:

答案 0 :(得分: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"

答案 1 :(得分:0)

你混合了两件完全不同的东西。包含2 4 5 6 7 等语句的代码片段处理中断,因为所述语句用于恢复中断状态,以便调用者可以处理它。

由于你想要处理中断,这不是正确的事情。如果您检测到中断,您只需要一个简单的语句告诉编译器该做什么。因此,如果您希望您的任务在中断时返回,只需使用一个简单的语句

Thread.currentThread().interrupt()

通常,不要从其他目的不明白的地方复制代码。