我正在尝试中断长时间工作的线程。在我的例子中,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}}
答案 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()
通常,不要从其他目的不明白的地方复制代码。