• 线程中断


    1. 尝试获取一个内部锁的操作(进入一个 synchronized 块)是不能被中断的,但是 ReentrantLock 支持可中断的获取模式即 tryLock(long time, TimeUnit unit)

    2. 对于可取消的阻塞状态中的线程, 比如等待在这些函数上的线程, Thread.sleep(), Object.wait(), Thread.join(), 这个线程收到中断信号后, 会抛出InterruptedException, 同时会把中断状态置回为false

    3. 对于非阻塞中的线程, 只是改变了中断状态, 即Thread.isInterrupted()将返回true

    4. 中断是通过调用Thread.interrupt()方法来做的. 这个方法通过修改了被调用线程的中断状态来告知那个线程, 说它被中断了

    5. 中断状态可以通过 Thread.isInterrupted()来读取,并且可以通过一个名为 Thread.interrupted()的静态方法读取和清除状态(即调用该方法结束之后, 中断状态会变成false)

    /**
     *  Created by *** on 16/9/22.
     *  尝试获取一个内部锁的操作(进入一个 synchronized 块)是不能被中断的,但是 ReentrantLock 支持可中断的获取模式即 tryLock(long time, TimeUnit unit)
     *  对于可取消的阻塞状态中的线程, 比如等待在这些函数上的线程, Thread.sleep(), Object.wait(), Thread.join(), 这个线程收到中断信号后, 会抛出InterruptedException, 同时会把中断状态置回为false
     *  对于非阻塞中的线程, 只是改变了中断状态, 即Thread.isInterrupted()将返回true
     *  中断是通过调用Thread.interrupt()方法来做的. 这个方法通过修改了被调用线程的中断状态来告知那个线程, 说它被中断了
     *  中断状态可以通过 Thread.isInterrupted()来读取,并且可以通过一个名为 Thread.interrupted()的静态方法读取和清除状态(即调用该方法结束之后, 中断状态会变成false)
     *
     */
    public class InterruptedTest extends Thread {
    
        public void run(){
            while(true){
                if(Thread.interrupted()){
                    System.out.println("Someone interrupted me.");
                    //interrupt当前线程不会抛出异常
                    Thread.currentThread().interrupt();
                    System.out.println(Thread.currentThread().isInterrupted());
                }
                else{
                    System.out.println("Going...");
                }
                long now = System.currentTimeMillis();
                /*try {
                //此处如果抛出异常被捕获,中断状态会自动重置
                //线程收到中断信号后, 会抛出InterruptedException, 同时会把中断状态置回为false
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }*/
                while(System.currentTimeMillis()-now<1000){
                    // 为了避免Thread.sleep()而需要捕获InterruptedException而带来的理解上的困惑,
                    // 此处用这种方法空转1秒
                }
            }
        }
    
        public static void main(String[] args) throws InterruptedException {
            InterruptedTest t = new InterruptedTest();
            t.start();
            Thread.sleep(2300);
            t.interrupt();
        }
    }

    关于中断:它并不像stop方法那样会中断一个正在运行的线程。线程会不时地检测中断标识位,以判断线程是否应该被中断(中断标识值是否为true)。终端只会影响到wait状态、sleep状态和join状态。被打断的线程会抛出InterruptedException。
    Thread.interrupted()检查当前线程是否发生中断,返回boolean
    synchronized在获锁的过程中是不能被中断的。

    中断是一个状态!interrupt()方法只是将这个状态置为true而已。所以说正常运行的程序不去检测状态,就不会终止,而wait等阻塞方法会去检查并抛出异常。如果在正常运行的程序中添加while(!Thread.interrupted()) ,则同样可以在中断后离开代码体

  • 相关阅读:
    PL/SQL database character set(AL32UTF8) and Client character set(ZHS16GBK) are different
    pl sql 无法解析指定的连接标识符
    【转】几个常用的Oracle存储过程
    .NET 条件查询实现--类似网上商城宝贝搜索
    SQL Server 中大小写区分的处理
    .NET DataGrid 导出Excel 无分页
    C# 读书笔记之访问虚方法、重写方法和隐藏方法
    人工智能技术在中小学课堂中的应用
    dzzoffice协同办公平台与onlyoffice在线协作平台安装与部署
    一本通 确定进制
  • 原文地址:https://www.cnblogs.com/binnzhao/p/6192724.html
Copyright © 2020-2023  润新知