java 线程:Thread.interrupt() 不工作
java thread: Thread.interrupt() not working
我需要终止一个未在我的代码中创建的线程。也就是说,线程对象是由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() returns 一个名为 "ModalContext" 的线程。 t.getThreadGroup().list()行returns以下数据:
...
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]
变量 "dialog" 和 "rp" 没有引用它们的 运行nable 对象。而且他们没有任何关闭或取消的方法。所以我想直接杀死那个线程"ModalContext"。调用 t.interrupt() 不起作用。线程 MoadlContext 继续 运行。我怎样才能杀死线程?谢谢
t.interrupt()
实际上并没有立即中断线程,它只是更新线程的中断状态。如果您的线程包含轮询中断状态的方法(即 sleep
),那么线程将被中断,否则线程将简单地完成执行并且中断状态将被 ignored.
考虑以下示例,
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
现在只需在 run
中添加 Thread.sleep(200);
,您将看到 InterruptedException
。
interrupt
method 不会终止线程。它在 Thread
上设置 "interrupted" 状态,如果它正在休眠或等待 I/O,那么它调用的那个方法将抛出一个 InterruptedException
.
但是,您在 sleep
完成后在当前线程上调用 interrupt
,因此除了设置 "interrupted" 状态外什么都不做。
您可以执行以下操作之一:
- 再
Thread
调用 interrupt
Thread
。在 run()
中,如果捕获到 InterruptedException
或 interrupted()
returns true
. ,则让方法完成
- 声明一个
volatile boolean
变量(比如 isRunning
),在创建的线程中初始化为 true
。如果它是 false
,该线程将让 run()
方法完成。在适当的时候让另一个 Thread
将其设置为 false
。
我需要终止一个未在我的代码中创建的线程。也就是说,线程对象是由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() returns 一个名为 "ModalContext" 的线程。 t.getThreadGroup().list()行returns以下数据:
...
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]
变量 "dialog" 和 "rp" 没有引用它们的 运行nable 对象。而且他们没有任何关闭或取消的方法。所以我想直接杀死那个线程"ModalContext"。调用 t.interrupt() 不起作用。线程 MoadlContext 继续 运行。我怎样才能杀死线程?谢谢
t.interrupt()
实际上并没有立即中断线程,它只是更新线程的中断状态。如果您的线程包含轮询中断状态的方法(即 sleep
),那么线程将被中断,否则线程将简单地完成执行并且中断状态将被 ignored.
考虑以下示例,
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
现在只需在 run
中添加 Thread.sleep(200);
,您将看到 InterruptedException
。
interrupt
method 不会终止线程。它在 Thread
上设置 "interrupted" 状态,如果它正在休眠或等待 I/O,那么它调用的那个方法将抛出一个 InterruptedException
.
但是,您在 sleep
完成后在当前线程上调用 interrupt
,因此除了设置 "interrupted" 状态外什么都不做。
您可以执行以下操作之一:
- 再
Thread
调用interrupt
Thread
。在run()
中,如果捕获到InterruptedException
或interrupted()
returnstrue
. ,则让方法完成
- 声明一个
volatile boolean
变量(比如isRunning
),在创建的线程中初始化为true
。如果它是false
,该线程将让run()
方法完成。在适当的时候让另一个Thread
将其设置为false
。