Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java线程:thread.interrupt()不工作_Java_Multithreading_Swt_Eclipse Rcp - Fatal编程技术网

java线程:thread.interrupt()不工作

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

我需要杀死一个不是在我的代码中创建的线程。换句话说,线程对象是由api(EclipseJFace)创建的。这是我的密码

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他说线程代码不在他的控制之下。