java线程:thread.interrupt()不工作
我需要杀死一个不是在我的代码中创建的线程。换句话说,线程对象是由api(EclipseJFace)创建的。这是我的密码java线程:thread.interrupt()不工作,java,multithreading,swt,eclipse-rcp,Java,Multithreading,Swt,Eclipse Rcp,我需要杀死一个不是在我的代码中创建的线程。换句话说,线程对象是由api(EclipseJFace)创建的。这是我的密码 ProgressMonitorDialog dialog = new ProgressMonitorDialog(null); try { IRunnableWithProgress rp = new IRunnableWithProgress(){ @Override public void run(IProg
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();
}
currentThread()返回一个名为“ModalContext”的线程。行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]
变量“dialog”和“rp”没有对其可运行对象的引用。而且他们没有任何关闭或取消的方法。所以我想直接杀死那个线程“ModalContext”。调用t.interrupt()无效。线程上下文继续运行。我怎样才能切断线呢?谢谢。中断()实际上不会立即中断线程,它只会更新线程的中断状态。如果您的线程包含只轮询中断状态(即睡眠
)的方法,则该线程将被中断,否则该线程仅完成执行,中断状态将被忽略
考虑下面的例子
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");
}
}
现在只需添加Thread.sleep(200)在运行时,您将看到中断异常t。中断()
实际上不会立即中断线程,它只会更新线程的中断状态。如果您的线程包含只轮询中断状态(即睡眠
)的方法,则该线程将被中断,否则该线程仅完成执行,中断状态将被忽略
考虑下面的例子
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");
}
}
现在只需添加Thread.sleep(200)代码>在运行时
会看到中断异常
不会终止线程。它在线程上设置“中断”状态,如果它正在睡眠或等待I/O,那么它调用的方法将抛出中断异常
但是,在sleep
完成后,您在当前线程上调用interrupt
,因此这只会设置“interrupted”状态
您可以执行以下操作之一:
对该线程
调用中断
。在run()
中,如果捕获到InterruptedException
或返回true
,则让该方法完成
声明一个volatile boolean
变量(例如,isRunning
),该变量在创建的线程中初始化为true
。如果为false,该线程将让run()
方法完成。让另一个线程
在适当的时间将其设置为false
线程不会终止线程。它在线程上设置“中断”状态,如果它正在睡眠或等待I/O,那么它调用的方法将抛出中断异常
但是,在sleep
完成后,您在当前线程上调用interrupt
,因此这只会设置“interrupted”状态
您可以执行以下操作之一:
对该线程
调用中断
。在run()
中,如果捕获到InterruptedException
或返回true
,则让该方法完成
声明一个volatile boolean
变量(例如,isRunning
),该变量在创建的线程中初始化为true
。如果为false,该线程将让run()
方法完成。让另一个线程
在适当的时间将其设置为false
请注意,Thread#interrupt()
不应该杀死线程,而是将其从#sleep
中唤醒。当线程以一种方式(return
)或另一种方式(异常)离开run
方法时,线程结束。在线程中运行一个布尔值isRunning,并在调用run()方法之前将其设为true。将while(isRunning)作为run方法中的第一行。当你想停止线程时,将布尔值设为false。@76他说线程代码不在他的控制之下。为了记录在案,thread#interrupt()
不应该杀死线程,而是将其从#sleep
中唤醒。当线程以一种方式(return
)或另一种方式(异常)离开run
方法时,线程结束。在线程中运行一个布尔值isRunning,并在调用run()方法之前将其设为true。将while(isRunning)作为run方法中的第一行。当你想停止线程时,将布尔值设为false。@76他说线程代码不在他的控制之下。