Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.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 多线程中断方法调用_Java_Multithreading - Fatal编程技术网

Java 多线程中断方法调用

Java 多线程中断方法调用,java,multithreading,Java,Multithreading,我编写了一个java线程中断代码,但是通过调用中断方法,生成了异常,但是线程没有停止 public class MULTITHREADING_9 { public static void main(String[] args) { CHILD_THREAD childThread = new CHILD_THREAD(); childThread.start(); childThread.interrupt(); Sys

我编写了一个java线程中断代码,但是通过调用中断方法,生成了异常,但是线程没有停止

public class MULTITHREADING_9 {
    public static void main(String[] args) {

        CHILD_THREAD childThread = new CHILD_THREAD();
        childThread.start();
        childThread.interrupt();

        System.out.println("MAIN_END");
    }

}
public class CHILD_THREAD extends Thread {

    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println("I'AM A LAZY THREAD");
            try {
                Thread.sleep(10000);
            } catch (InterruptedException e) {
                System.out.println("CHILD_THREAD_INTERRUPTED");
            }

        }
    }
}

interrupt
方法在线程睡眠时导致
InterruptedException
。当捕获
InterruptedException
时,您应该从方法返回
(或者中断循环-这取决于您需要什么),以停止线程。
此外,在每次迭代中检查线程是否被另一个线程中断也是一种很好的方式:
Thread.currentThread().isInterrupted()

大概是这样的:

public class CHILD_THREAD extends Thread {

    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            if (Thread.currentThread().isInterrupted()) {
                System.out.println("CHILD_THREAD_INTERRUPTED");
                return;
            }
            System.out.println("I'AM A LAZY THREAD");
            try {
                Thread.sleep(10000);
            } catch (InterruptedException e) {
                System.out.println("CHILD_THREAD_INTERRUPTED");
                return;
            }
        }
    }
}

仍然有疑问,如果子线程被中断导致异常,为什么子线程不被停止。@LafhangaLadka,因为它只是抛出
InterruptedException
,而您在
catch
块中捕获它。线程不能立即停止,因为它可能持有任何资源,例如数据库连接。在那个挡块里,你必须在停止电流之前把它关上thread@LafhangaLadka,中断!=停止,因为中断只是线程的一个信号。尚未要求线程停止。线程不会停止,因为您正在捕获异常。中断只不过是线程之间的消息传递机制。从Java并发实践来看:“API或语言规范中没有任何东西将中断与任何特定的取消语义联系起来”。换句话说:被中断的任务需要对中断做出响应,取消才能正常工作。
public class CHILD_THREAD extends Thread {

    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            if (Thread.currentThread().isInterrupted()) {
                System.out.println("CHILD_THREAD_INTERRUPTED");
                return;
            }
            System.out.println("I'AM A LAZY THREAD");
            try {
                Thread.sleep(10000);
            } catch (InterruptedException e) {
                System.out.println("CHILD_THREAD_INTERRUPTED");
                return;
            }
        }
    }
}
public class CHILD_THREAD extends Thread {

    @Override
    public void run() {
        try {
            for (int i = 0; i < 5; i++) {
                if (Thread.currentThread().isInterrupted()) {
                    System.out.println("CHILD_THREAD_INTERRUPTED");
                    return;
                }
                System.out.println("I'AM A LAZY THREAD");
                Thread.sleep(10000);
            }
        } catch (InterruptedException e) {
            System.out.println("CHILD_THREAD_INTERRUPTED");
        }
    }
}