zoukankan      html  css  js  c++  java
  • 多线程 interrupt()方法

    java interrupt()方法只是设置线程的中断标记,当对处于阻塞状态的线程调用interrupt方法时(处于阻塞状态的线程是调用sleep, wait, join 的线程),会抛出InterruptException异常,而这个异常会清除中断标记。并且异常如果被捕获且没有重新抛出后续代码将继续执行。Thread.interrupt()方法不会中断一个正在运行的线程。这一方法实际上完成的是,在线程受到阻塞时抛出一个中断信号,这样线程就得以退出阻塞的状态。更确切的说,如果线程被Object.wait, Thread.join和Thread.sleep三种方法之一阻塞,那么,它将接收到一个中断异常(InterruptedException),从而提早地终结被阻塞状态。 

    代码如下:

    public class Main {
    @Test
    public void interruptedTest() {

    Runnable runnableError = () -> {
    //不会退出
    while (!Thread.interrupted()) {
    System.out.println(new Date());
    try {
    TimeUnit.SECONDS.sleep(3);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    }
    //unreachable
    System.out.println("interrupted: " + Thread.interrupted());
    };
    //可以退出
    Runnable runnable = () -> {
    try {
    while (!Thread.interrupted()) {
    System.out.println(new Date());
    TimeUnit.SECONDS.sleep(3);
    }
    //unreachable
    System.out.println("interrupted: " + Thread.interrupted());
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    System.out.println("reachable");
    };
    Thread thread = new Thread(runnable);

    thread.start();
    try {
    TimeUnit.SECONDS.sleep(2);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    thread.interrupt();
    try {
    thread.join();
    Thread.sleep(5000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    assert (!thread.isInterrupted());
    System.out.println("end: " + new Date());
    }
    }

    特别需要注意的是:

    Thread.Interrupted()除了会返回当前线程是否被中断之外,还会将线程状态恢复为未中断状态。而public boolean isInterrupted()不改变状态


    代码如下:
        //清除状态
        public static boolean interrupted() {
            return currentThread().isInterrupted(true);
        }
        //保留状态
        public boolean isInterrupted() {
            return isInterrupted(false);
        }
    

      

    参考:

    http://blog.csdn.net/u013238950/article/details/53893676

    http://blog.csdn.net/wxwzy738/article/details/8516253

  • 相关阅读:
    python
    python
    网站备案流程_网站备案需要什么
    php 导出 Excel 报错 exception 'PHPExcel_Calculation_Exception' with message
    EasyUI-datagrid-自动合并单元格(转)
    win2008阿里一键环境包mysql老是1067报错
    微信公众平台开发(58)自定义菜单
    Token验证失败的解决方法
    jquery设置select选中
    YII学习第二十三天,accessRules用法
  • 原文地址:https://www.cnblogs.com/heapStark/p/8167747.html
Copyright © 2011-2022 走看看