java - 线程中断。有人可以向我解释输出以更好地理解中断吗?

标签 java multithreading interrupt interrupted-exception

<分区>

我能够理解线程和中断。我试图映射从 Oracle 教程中学到的基本概念,以更好地理解中断的概念。我开发了这个例子,并努力理解输出是如何中断在这里发挥作用的。我只是不明白。所以我的想法是请人帮助我理解这个程序的输出,这将使我更清楚中断的基本功能。

public class ThreadSleepTest {
    public static void main(String[] args) throws InterruptedException {
        MyRunnable myRunnable = new MyRunnable();
        Thread one = new Thread(myRunnable);
        one.setName("Fred");
        Thread two = new Thread(myRunnable);
        two.setName("Lucy");
        Thread three = new Thread(myRunnable);
        three.setName("Ricky");
        one.start();
        two.start();
        three.start();
        //Thread.sleep(1000);
        one.interrupt();
     }    
}

class MyRunnable implements Runnable {
    public void run() {
        for (int x = 1; x < 4; x++) {
            System.out.println("Run by: " + Thread.currentThread().getName());
            try {
                Thread.sleep(1000);
            } catch (InterruptedException ie) {
                System.out.println("Exception occured");
            }
        }
        System.out.println("Do something");
    }
}

这是我控制台的输出。

Run by: Lucy
Run by: Fred
Run by: Ricky
Exception occured
Run by: Fred
Run by: Fred
Run by: Lucy
Run by: Ricky
Do something
Run by: Lucy
Run by: Ricky
Do something
Do something

最佳答案

Once a thread is interrupted, it is basically taken out of operation as per my understanding.

不对,你的理解不正确。一旦线程被中断,由编写 run 方法的程序员决定如何处理。

线程终止完全取决于程序员,因为 JVM 实际上不知道在终止线程时可能需要清除哪些资源和锁。这就是为什么 Thread 中的方法 stop()suspend() 被弃用的原因。它们不安全。

所以当一个线程被中断时,如果你在一个抛出 InterruptedException 的方法中,你必须对这个异常使用react并完成你正在做的任何事情,如果你在在你自己的东西中间,你必须不时检查当前线程的interrupted()状态,如果发生中断,就完成你正在做的事情。

这是您在线程中断时选择执行的操作:

        try {
            Thread.sleep(1000);
        } catch (InterruptedException ie) {
            System.out.println("Exception occured");
        }

在您的 catch 子句中,您只是打印异常发生的事实。您实际上并没有为线程的终止做任何事情。因此,它不会被终止。您将退出 catch 子句,并继续循环的下一次迭代。

Thread.sleep() 按照惯例在抛出 InterruptedException 时清除中断标志。于是在下一次迭代中,线程不再“中断”,sleep()也不会再次抛出异常。

关于java - 线程中断。有人可以向我解释输出以更好地理解中断吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29864773/

相关文章:

c++ - Boost 线程在作业完成之前就终止了

multithreading - 如何同时在recv()和sem_wait()上等待?

multithreading - 树状结构中的多线程

java - 计数器应用程序不会停止

java - Netty 和 MongoDB 异步回调不能一起工作

java - TextFlow vs TextArea,布局问题;为什么 TextFlow 在 TextArea 没有的地方弄乱了它?

java - 高斯消元Java

linux - 被 ptrace 中断的 CPU 上下文在哪里,用户空间堆栈还是内核堆栈?

java - 在Java中中断另一个线程的run方法中的一个线程

java - 访问用作缓存的HashMap