一个线程可以中断另一个线程吗?

时间:2015-11-27 06:48:25

标签: java multithreading interrupt

我想知道在第一个线程的run方法中中断另一个线程是否违法。如果是,当我在第一个线程的run方法中调用另一个线程的中断方法时,会抛出“InterruptedException”吗?像这样:

public static void main(String[] args) {

    Thread thread1 = new Thread(() -> {
        while (true) {

        }
    }, "thread1");
    try {
        thread1.sleep(10000);
    } catch (InterruptedException e) {
        System.out.println("Oops! I'm interrupted!"); 
    }
    Thread thread2 = new Thread(() -> {
        System.out.println("I will interrupt thread1!");
        thread1.interrupt();
        System.out.println("Thread1 interruption done!");
    }, "thread2");
    thread1.start();
    thread2.start();
}

但我没有留言“哎呀!我被打断了!”在控制台中。

1 个答案:

答案 0 :(得分:5)

您的程序无法正常工作的原因是您使用def allRows(rs: ResultSet): Stream[Row] = Stream.continually(if (rs.next) Some(new Row(rs)) else None) .takeWhile(_.isDefined).map(_.get) 引用来访问静态thread1方法,但仍然在主线程中执行休眠。
将其移动到sleep()的正文中,您的程序运行正常:

thread1

打印:

public static void main(String[] args) {
    Thread thread1 = new Thread(() -> {
        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            System.out.println("Oops! I'm interrupted!");
        }
    }, "thread1");

    Thread thread2 = new Thread(() -> {
        System.out.println("I will interrupt thread1!");
        thread1.interrupt();
        System.out.println("Thread1 interruption done!");
    }, "thread2");
    thread1.start();
    thread2.start();
}

请注意,最后两个打印输出的顺序取决于线程安排,并且可能会有所不同。