关于java:JAVA并发编程线程中断机制与interrupt

3次阅读

共计 2979 个字符,预计需要花费 8 分钟才能阅读完成。

1. 线程中断是什么

2. 中断的相干 API 办法

3. 通过一个 volatile 变量实现线程中断

4. 通过 Thread 类自带的中断 api 办法实现

5. 以后线程的中断标识为 true,是不是就立即进行?

6. 静态方法 Thread.interrupted()介绍

7. 总结

1. 线程中断是什么
咱们都晓得,JAVA 启动一个线程很容易,而且咱们 都是通过线程完结之后才进行 ,然而咱们会不会有这样一种状况, 那就是线程在运行到一半的时候,咱们人为地把这个运行到一半的线程给进行 ,这就是明天咱们要说的, 线程中断机制。

点开 Thread.java 的源码,咱们发现是有stop,suspend(挂起),resume(复原) 等办法,然而这些办法都曾经被弃用了,所以不能应用。

在当初的多线程编程中,一个线程 不应该由其它线程强制中断或者进行 ,而是 应该由线程本人进行,所以下面几个办法被弃用了。

在 JAVA 中没有方法立刻进行一个线程,然而进行线程显得尤为重要,比方勾销一个十分耗时的操作,所以 JAVA 提供了一种进行线程的机制————中断

中断只是一种合作机制,JAVA 没有给中断减少任何的语法,中断的过程齐全须要程序员本人实现。

若要中断一个线程,你须要手动调用该线程的 interrupt 办法,该办法也 仅仅是将线程对象的中断标识设置成 true;

接着你须要本人写代码一直检测以后线程的标示位,如果为 true, 标识别的线程要求这条线程中断,此时到底做什么须要你本人写代码实现

每个线程对象中都有一个标识,用于标识线程是否被中断:
该标识 true 示意中断,false 示意未中断;

通过调用线程对象的 interrupt 办法将该线程的标示位设置为 true,能够在别的线程中调用,也能够在本人的线程中调用。

2. 中断的相干 API 办法

// 实例办法 interrupt()仅仅只是设置线程的中断标记位为 true,不会进行线程
public void interrupt();

// 这个办法做了两件事
//1. 返回以后线程的中断状态
//2. 将以后线程的中断状态设置为 true
public static boolean interrupted();

// 判断以后线程是否被中断
public boolean isInterrupted()

3. 通过一个 volatile 变量实现线程中断

public class InterruptDemo {
    // 这是一个中断的标记位
    private static volatile boolean isStop = false;

    public static void main(String[] args) {
        // 启动一个线程,始终进行循环,如果中断的标记位被其它线程改成了 true,则进行线程的执行
        new Thread(() -> {while (true) {if (isStop) {System.out.println(Thread.currentThread().getName() + "线程 ------isStop = true, 本人退出了");
                    break;
                }
                System.out.println("-------hello interrupt");
            }
        }, "t1").start();

        // 暂停几秒钟线程
        try {TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {e.printStackTrace();
        }
        isStop = true;
    }

}

4. 通过 Thread 类自带的中断 api 办法实现

public class InterruptDemo2 {public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread(() -> {while(true){System.out.println("线程正在运行");
                if(Thread.currentThread().isInterrupted()){System.out.println("线程被打断 isInterrupted:" + Thread.currentThread().isInterrupted());
                    break;
                }
            }
        }, "t1");
        t1.start();

        // 活动状态,t1 线程还在执行中
        try {TimeUnit.MILLISECONDS.sleep(3);
        } catch (InterruptedException e) {e.printStackTrace();
        }
        // 打断线程
        t1.interrupt();
        // 让线程跳出循环程序
        try {TimeUnit.MILLISECONDS.sleep(3000);
        } catch (InterruptedException e) {e.printStackTrace();
        }
    }
}

5. 以后线程的中断标识为 true,是不是就立即进行?
从下面那两个案例中能够看出,中断只是一种协同机制,批改中断标识位仅此而已,而不是文科 stop 打断。

6. 静态方法 Thread.interrupted()介绍

这个办法,次要是有两个作用:
1)判断以后线程是否被中断,并返回这个标记位(就是返回以后线程的中断状态)
2)革除以后线程的中断状态

    public static void main(String[] args) throws InterruptedException {System.out.println(Thread.currentThread().getName() + "---" + Thread.interrupted());
        System.out.println(Thread.currentThread().getName() + "---" + Thread.interrupted());
        System.out.println("111111");
        Thread.currentThread().interrupt();
        System.out.println("222222");
        System.out.println(Thread.currentThread().getName() + "---" + Thread.interrupted());
        System.out.println(Thread.currentThread().getName() + "---" + Thread.interrupted());
    }

返回后果为:

能够看出,

还没有调用 interrupt()办法的时候:
调用 interrupted()返回的以后线程中断状态都是 false(未被中断)。

调用了 interrupt()办法之后:
第一次调用 interrupted(),返回以后的中断状态为(true), 并且 革除了以后线程的中断状态 ,从 true 改为 false。
第二次调用interrupted(),返回以后的中断状态为(false), 因为以后线程的中断状态为 false,所以状态不扭转。

7. 总结

1)中断只是一种协同机制,批改中断标识位仅此而已,不是立即 stop 打断
2)手动调用该线程的 interrupt 办法,该办法也 仅仅是将线程对象的中断标识设置成 true
3)须要本人写代码一直检测以后线程的标示位 ,如果为 true, 标识别的线程要求这条线程中断,此时到底做什么须要你本人写代码实现。
4) 间断调用两次 interrupted(),返回的后果可能会不雷同

正文完
 0