您当前的位置: 首页 >  Java

java持续实践

暂无认证

  • 1浏览

    0关注

    746博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Java多线程 判断是否已经被中断的方法 interrupted&isInterrupted示例

java持续实践 发布时间:2020-08-29 10:47:11 ,浏览量:1

文章目录
      • 判断是否已经被中断的方法
      • 判断是否已经被中断demo

判断是否已经被中断的方法

关于线程状态的方法, 有如下的三个. 返回值都是布尔类型 其中两个为static静态的方法.

方法一和方法二都是返回线程的中断状态, 区别在于 , 方法一除了会把线程的中断状态返回之外, 还会把线程的中断状态设置为false. 会清除线程的中断状态. 如下的源码所示, isInterrupted传入true 代表清除线程的中断状态.

  //方法一  
	public static boolean interrupted() {
	       return currentThread().isInterrupted(true);
	   }

 //方法二
  public boolean isInterrupted() {
        return isInterrupted(false);
    }
    
    //方法三  
  public static boolean interrupted() {
        return currentThread().isInterrupted(true);
    }
判断是否已经被中断demo

对于上面的方法一和方法二, 有如下的代码示例. 主要的流程是启动了一个子线程, 并且给出了中断的信号.

在打印语句中, 判断是否被中断了.

package com.thread.stopthreads;

/**
 * 类名称:RightWayInterrupted
 * 类描述: 注意Thread.interrupted()方法的目标对象是“当前线程”,而不管本方法来自于哪个对象
 *
 * @author: https://javaweixin6.blog.csdn.net/
 * 创建时间:2020/8/29 10:23
 * Version 1.0
 */
public class RightWayInterrupted {

    public static void main(String[] args) throws InterruptedException {

        Thread threadOne = new Thread(new Runnable() {
            @Override
            public void run() {
                for (; ; ) {
                }
            }
        });

        // 启动线程
        threadOne.start();
        //设置 子线程的中断标志
        threadOne.interrupt();
        //获取中断标志      此方法不会清除中断状态
        System.out.println("isInterrupted: " + threadOne.isInterrupted());

        //获取中断标志并重置     此方法会清除中断状态
        System.out.println("isInterrupted: " + threadOne.interrupted());

        //获取中断标志并重直    main线程 此方法会清除中断状态
        System.out.println("main  isInterrupted: " + Thread.interrupted());

        //获取中断标志
        System.out.println("isInterrupted: " + threadOne.isInterrupted());
        threadOne.join();
        System.out.println("Main thread is over.");
    }
}

关键代码如下图. 根据逻辑分析 , 第一个打印语句, 只是判断子线程是否被中断了, 由于上面给出了中断的信号, 那么肯定是返回true的. 但是第二个语句, 是给出是否中断 , 并且把中断信号清除的. 但是第一个方法只是给出状态, 没有清除中断, 所以应该也是返回true 第三个语句是判断main线程是否被中断, 由于没有给main线程中断信号,所以应该是返回false. 第四个语句, 判断子线程是否被中断, 由于第二个线程清除了中断信号, 所以应该返回false. 但是实际的打印语句如下, 第二个打印语句, 却是false , 第四个打印语句却是true . 这是由于 , public static boolean interrupted() 这个静态方法的目标对象是“当前线程”,而不管本方法来自于哪个对象. 虽然本方法来自于子线程的调用, 但是目标对象的当前线程是main线程, 由于main线程是没有给出中断信号的, 所以返回的是false. 第四个打印语句, 由于子线程的中断状态其实是一直都没有被清除掉的, 因此返回的是true.

关注
打赏
1658054974
查看更多评论
立即登录/注册

微信扫码登录

0.0411s