java - 如何使用线程中断方法停止线程

标签 java multithreading concurrency java-threads interruption

我正在尝试学习线程中断以及如何在不调用 stop 的情况下终止线程。

public class Test implements Runnable{
        static Thread threadTest=null;
        public static void main(String args[]){
          System.out.println("Hello i am main thread");
          Test thread= new Test();
          threadTest= new Thread(thread);
          threadTest.start();   
}

private static void exitThread() {
    threadTest.interrupt();
}

 @Override
 public void run() {
    boolean run = true;
    while (run) {
        try {
            System.out.println("Sleeping");
            Thread.sleep((long) 10000);
            exitThread();
            System.out.println("Processing");

        } catch (InterruptedException e) {

            run = false;
        }
    }

}


}

输出

Hello i am main thread

Sleeping

Processing

Sleeping

我无法理解为什么第二次打印 Sleeping 并且第二次而不是第一次抛出中断异常。我检查了使用 volatile 关键字停止 java 线程的帖子。但我无法理解那是怎么回事将在这种情况下使用,因为线程因中断而停止。

最佳答案

为了看到线程被中断而不是第二次进入sleep方法,改变run方法中的while循环测试来检查中断标志:

@Override
 public void run() {
    while (!Thread.currentThread().isInterrupted()) {
        try {
            System.out.println("Sleeping");
            Thread.sleep((long) 10000);
            exitThread();
            System.out.println("Processing");
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
    }
}

线程会 hibernate ,然后设置自己的中断标志,然后检查标志并终止。 InterruptedException 将仅在设置中断标志时线程处于 hibernate 状态时由 Thread#sleep 方法抛出。

不需要您的本地 boolean 变量。如果 Thread#sleep 抛出一个 InterruptedException(在这个例子中它不会因为线程检查中断标志并离开 while 循环)然后中断标志被清除,在 catch block 中恢复它允许 while 测试看到线程被中断。

在实际程序中,线程会被另一个线程中断,线程没有理由中断自身(它可以直接返回)。

关于java - 如何使用线程中断方法停止线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31895612/

相关文章:

java - 最佳并发锁 : one WRITE and infinite number of READ

java - 在不同系统的 Android Studio 上构建失败

java - 使用复制构造函数同时修改列表

java - 当我创建具有不同类名和不同构造函数名称的对象时,如何调用方法

c# - 多线程程序逻辑

multithreading - VM 上的 Azure "Percentage CPU"指标

c# - WPF 线程错误(处理了无效操作异常)

python - 在 Python 3 中发送多个 HTTP 请求的最佳方式是什么?

java - 无法在小米 redmi 4 中调试 android 应用程序?

java - 我们如何使用 PostgreSQL 中的加密来获取地理服务器中的原始数据