zoukankan      html  css  js  c++  java
  • java多线程 interrupt(), interrupted(), isInterrupted()方法区别

    interrupt()方法: 作用是中断线程。

    • 本线程中断自身是被允许的,且"中断标记"设置为true
    • 其它线程调用本线程的interrupt()方法时,会通过checkAccess()检查权限。这有可能抛出SecurityException异常。 
      • 若线程在阻塞状态时,调用了它的interrupt()方法,那么它的“中断状态”会被清除并且会收到一个InterruptedException异常。 
        • 例如,线程通过wait()进入阻塞状态,此时通过interrupt()中断该线程;调用interrupt()会立即将线程的中断标记设为“true”,但是由于线程处于阻塞状态,所以该“中断标记”会立即被清除为“false”,同时,会产生一个InterruptedException的异常。
      • 如果线程被阻塞在一个Selector选择器中,那么通过interrupt()中断它时;线程的中断标记会被设置为true,并且它会立即从选择操作中返回。
      • 如果不属于前面所说的情况,那么通过interrupt()中断线程时,它的中断标记会被设置为“true”。
     

    interrupted()方法

    判断的是当前线程是否处于中断状态。是类的静态方法,同时会清除线程的中断状态。

     
    1 public static boolean interrupted() {
    2   return currentThread().isInterrupted(true);
    3 }

    isInterrupted()方法

    判断调用线程是否处于中断状态 
    例如:

     
    public static void main(String[] args){
      Thread thread = new Thread(()->{}); //定义一个线程,伪代码没有具体实现
      thread.isInterrupted();//判断thread是否处于中断状态,而不是主线程是否处于中断状态
      Thread.isInterrupted(); //判断主线程是否处于中断状态
    }

    线程停止

    • 通过“中断标记”终止线程。
     
    @Override
    public void run() {
      while (!isInterrupted()) {
    // 执行任务...
      }
    }

    说明:isInterrupted()是判断线程的中断标记是不是为true。当线程处于运行状态,并且我们需要终止它时;可以调用线程的interrupt()方法,使用线程的中断标记为true,即isInterrupted()会返回true。此时,就会退出while循环。 
    注意:interrupt()并不会终止处于“运行状态”的线程!它会将线程的中断标记设为true。

    • 通过“额外添加标记”。
      
    private volatile boolean flag= true;
    protected void stopTask() {
      flag = false;
      }
      @Override
      public void run() {
      while (flag) {
      // 执行任务...
      }
    }

    说明:线程中有一个flag标记,它的默认值是true;并且我们提供stopTask()来设置flag标记。当我们需要终止该线程时,调用该线程的stopTask()方法就可以让线程退出while循环。 
    注意:将flag定义为volatile类型,是为了保证flag的可见性。即其它线程通过stopTask()修改了flag之后,本线程能看到修改后的flag的值。

     

    综合线程处于“阻塞状态”和“运行状态”的终止方式,比较通用的终止线程的形式如下:

     
    @Override
    public void run() {
      try {
      // 1. isInterrupted()保证,只要中断标记为true就终止线程。
      while (!isInterrupted()) {
      // 执行任务...
      }
      } catch (InterruptedException ie) {
      // 2. InterruptedException异常保证,当InterruptedException异常产生时,线程被终止。
      }
    }
  • 相关阅读:
    重要网址(工具的使用)
    navicat的使用(测试库和正式库同步)以及用plsql改表字段属性
    linux
    linux一些基本命令
    LINUX的一些基本概念和操作
    LINUX简介
    Redis系统管理
    Redis之数据类型
    Redis的简介与安装
    论文阅读笔记(二十七)【AAAI2019】:A Bottom-Up Clustering Approach to Unsupervised Person Re-Identification
  • 原文地址:https://www.cnblogs.com/huangyichun/p/7126851.html
Copyright © 2011-2022 走看看