我需要杀死一个不是在我的代码中创建的线程。换句话说,线程对象是由api(Eclipse JFace)创建的。这是我的代码
ProgressMonitorDialog dialog = new ProgressMonitorDialog(null);
try {
IRunnableWithProgress rp = new IRunnableWithProgress(){
@Override
public void run(IProgressMonitor monitor)
throws InvocationTargetException, InterruptedException {
Thread.sleep(3000);
Thread t = Thread.currentThread();
t.getThreadGroup().list();
t.interrupt();
}
};
dialog.run(true, true, rp);
}
catch (Exception e) {
e.printStackTrace();
}
Thread.currentThread()返回名为“ModalContext”的线程。 line t.getThreadGroup()。list()返回以下数据:
...
Thread[qtp1821431-38,5,main]
Thread[qtp1821431-39,5,main]
Thread[qtp1821431-40,5,main]
Thread[qtp1821431-42 Acceptor0 SelectChannelConnector@0.0.0.0:18080,5,main]
Thread[DestroyJavaVM,5,main]
Thread[ModalContext,5,main]
变量“对话框”和“rp”没有引用它们的可运行对象。他们没有任何方法可以关闭或取消。所以我想直接杀死那个帖子“ModalContext”。调用t.interrupt()不起作用。线程MoadlContext继续运行。我该如何杀死线程?感谢
答案 0 :(得分:2)
t.interrupt()
实际上并不会立即中断线程,只会更新线程的中断状态。如果你的线程包含轮询中断状态的方法(即sleep
),那么线程将被中断,否则线程将完成执行并且中断状态将被忽略。
考虑以下示例,
class RunMe implements Runnable {
@Override
public void run() {
System.out.println("Executing :"+Thread.currentThread().getName());
for(int i = 1; i <= 5; i++) {
System.out.println("Inside loop for i = " +i);
}
System.out.println("Execution completed");
}
}
public class Interrupted {
public static void main(String[] args) {
RunMe runMe = new RunMe();
Thread t1 = new Thread(runMe);
t1.start();
t1.interrupt();//interrupt ignored
System.out.println("Interrupt method called to interrupt t1");
}
}
<强>输出强>
Interrupt method called to interrupt t1
Executing :Thread-0
Inside loop for i = 1
Inside loop for i = 2
Inside loop for i = 3
Inside loop for i = 4
Inside loop for i = 5
Execution completed
现在只需在Thread.sleep(200);
中添加run
,您就会看到InterruptedException
。
答案 1 :(得分:2)
interrupt
method不会杀死该帖子。它在Thread
上设置“中断”状态,如果它正在休眠或等待I / O,那么它正在调用的方法将抛出InterruptedException
。
但是,在interrupt
完成后,您在当前线程上调用sleep
,因此除了设置“已中断”状态外,此操作无效。
您可以执行以下操作之一:
Thread
上进行另一次interrupt
来电Thread
。在run()
中,如果抓住InterruptedException
或interrupted()
返回true
,请让方法完整。volatile boolean
的{{1}}变量(例如,isRunning
)。该线程将true
方法完成,如果它是run()
。让其他false
在适当的时间将其设置为Thread
。