前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >juc10-线程中断interrupt

juc10-线程中断interrupt

作者头像
潇洒
发布2023-10-20 10:09:07
1470
发布2023-10-20 10:09:07
举报
文章被收录于专栏:石头岛石头岛

interrupt

作用

1.对运行中的线程,仅设置了一个停止的标记,但程序照常运行。 2.对阻塞中的线程,该线程会抛出InterruptedException异常。

interrupt方法用于中断线程。调用该方法的线程的状态为将被置为"中断"状态。 interrupt方法只能打上一个停止标记(改变状态),不能终止一个正在运行的线程,还需要加入一个判断才停止线程。

interrupt方法的使用效果并不像 for+break 语句那样,马上就停止循环。 调用interrupt方法是在当前线程中打了一个停止标志,并不是真的停止线程。

三个主要API 1.interrupt() :中间当前线程,实际并不是马上执行; 2.interrupted(): 获取前线程的interrupt状态,关置重置interrupt状态为false,即未打interrupt状态 ; 3.isInterrupted(): 获取前线程的interrupt状态,不重置;

看个小例子,子线程中断自己

代码语言:javascript
复制
/**
 * 主动中断线程
 */
public class MyThread extends Thread {
  @Override
  public void run(){
    super.run();
    try {
        for(int i=0; i<5000; i++){
            if (i == 100) {
                System.out.println("主动中断线程");
                Thread.currentThread().interrupt();
            }
            System.out.println("i="+(i+1));
            Thread.sleep(100);
        }
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
  }
}

class Run {
  public static void main(String args[]){
    Thread thread = new MyThread();
    thread.start();
  }
}

效果

代码语言:javascript
复制
i=99
i=100         //这里调用了,但是并没有马上中断
主动中断线程
i=101
java.lang.InterruptedException: sleep interrupted
      at java.lang.Thread.sleep(Native Method)
      at com.liukai.algorithm.practise.tree.MyThread.run(MyThread.java:18)

interrupted 判断当前线程状态

工作步骤:

  1. 检测当前线程是否被中断,是: 返回true,否: 返回false,
  2. 如果被中断,返回true,同时清除中断标志,即重置中断标志为false。
代码语言:javascript
复制
public class Test1 {

  public static void main(String[] args) {
    test();
  }
  public static void test() {
    try {
      TestThread testThread = new TestThread();
      System.out.println("start");
      testThread.start();
      testThread.sleep(1000);
      testThread.interrupted();
      System.out.println("是否中断1 " + testThread.isInterrupted());
      System.out.println("是否中断2 " + testThread.isInterrupted());
    } catch (InterruptedException e) {
      System.out.println("main catch");
      e.printStackTrace();
    }
    System.out.println("end");
  }
}

class TestThread extends Thread{
}

看下如何重置状态

代码语言:javascript
复制
public static boolean interrupted() {
    // 实际上就是通 isInterrupted 为 true
    return currentThread().isInterrupted(true);
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2014-12-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • interrupt
  • interrupted 判断当前线程状态
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档