java中断小记(二)

上一篇博文中,介绍了成员方法interrupt()的用法,这篇接上上篇继续介绍剩下的两个与中断有关的方法。

2.成员方法new Thread().isInterrupted()

通常使用Thread.currentThread().isInterrupted()方法判断某个线程是否已被发送过中断请求(某一线程被发送过中断请求后并一定会中断),因为它将线程中断标示位设置为true后,不会立刻清除中断标示位,即不会将中断标设置为false。程序示例如下:

package com.szw.test;

public class TestSun {
    public static void main(String[] args){
        // test1
        Thread t1 = new Thread(){
            @Override
            public void run(){
                try{
                    int i=0;
                    while(i++<100000000){
                        // nothing
                    }
                    System.out.println("A1");
                }catch(Exception e){
                    System.out.println("B1");
                    System.out.println(Thread.currentThread().isInterrupted() + " in catch");//抛出异常之后中断标志位才清除
                }
            };
        };
        t1.start();      
        System.out.println(t1.isInterrupted() + " before");//用来检查中断标志位的值
        t1.interrupt();//不中断正在运行的线程
        System.out.println(t1.isInterrupted() + " after");
    }
}
--------------
运行结果:
false before   //未调用interrupt()方法前,标志位为false
true after     //调用interrupt()方法之后标志位为true,  
A1             //线程t1调用了中断interrupt()方法,标准位也被设置为true,
               //但并没有中断,因为t1是正在运行的线程,interrupt()无法中断,
               //具体在上一篇《java中断小记(一)》中介绍

3.静态方法Thread.interrupted()

静态方法Thread.interrupted()来也可以用来获取中断状态,但在获取中断状态之后会清除中断状态(当然获取的是清除之前的值),也就是说连续两次调用此方法,第二次一定会返回false。程序示例:

package com.szw.test;

public class TestSun {
    public static void main(String[] args){
        // test1
        Thread t1 = new Thread(){
            @Override
            public void run(){
                try{
                    int i=0;
                    while(i++<100000000){
                        // nothing
                    }
                    System.out.println("A1");
                    System.out.println(Thread.interrupted() + " static");
                    System.out.println(Thread.interrupted() + " static 2");//第二次调用
                }catch(Exception e){
                    System.out.println("B1");
                    System.out.println(Thread.currentThread().isInterrupted() + " in catch");//抛出异常之后中断标志位才清除
                }
            };
        };
        t1.start();     
        System.out.println(t1.isInterrupted() + " before");
        t1.interrupt();//不中断正在运行的线程
        System.out.println(t1.isInterrupted() + " after");
    }
}
--------------------------------------------------
运行结果:
false before
true after
A1
true static
false static 2

-------------------------------
如果把t1.interrupt()注释掉,再次运行的结果为:
false before
false after
A1
false static            //第一次调用
false static 2          //第二次调用

到此关于中断的方法就告以段落了,最后贴上一道阿里的笔试题,可以分析下运行结果。。。

代码如下:

package com.szw.test;

public class TestThread{

    public static void main(String[] args){
        // test1
        Thread t1 = new Thread(){
            @Override
            public void run(){
                try{
                    int i=0;
                    while(i++<100000000){
                        // nothing
                    }
                    System.out.println("A1");
                }catch(Exception e){
                    System.out.println("B1");
                }
            };
        };
        t1.start();
        t1.interrupt();//不中断正在运行的线程
        
        // test2
        Thread t2 = new Thread(){
            public void run(){
                try{
                    Thread.sleep(5000);
                    System.out.println("A2");
                }catch(Exception e){
                    System.out.println("B2");
                }
            };
        };
        t2.start();
        t2.interrupt();    
        
        // test3
        Thread t3 = new Thread(){
            public void run(){
                try{
                    this.wait(50000);
                    System.out.println("A3");
                }catch(Exception e){
                    System.out.println("B3");
                }
            };
        };
        t3.start();
        t3.interrupt();    

        // test4
        Thread t4 = new Thread(){
            public void run(){
                try{
                    synchronized(this){
                        this.wait(50000);
                    }
                    System.out.println("A4");
                }catch(Exception e){
                    System.out.println("B4");
                }
            };
        };
        t4.start();
        t4.interrupt();    //可以中断是因为没有发生竞争上锁
        
        // test5
        try{
            t4.start();//Exception in thread "main" java.lang.IllegalThreadStateException
            System.out.println("A5");
        }catch(Exception e){
            System.out.println("B5");
        }
    }
}
时间: 2024-12-08 06:06:35

java中断小记(二)的相关文章

java中断小记

java中与中断相关的函数有如下三个:   1.通过成员方法Thread.interrupt()来设置中断状态为true   2.通过成员方法Thread.isInterrupted()来获取中断状态   3.通过静态方法Thread.interrupted()来获取中断状态,并且清除中断状态(当然获取的是清除之前的值),也就是说连续两次调用此方法,第二次一定会返回false. 下面详细介绍各个方法. 成员方法new Thread().interrupt() 线程的成员方法new Thread(

java 基础(二)

java 基础(二)java 基础(二) 2016-2-1 by Damon 61. 编写多线程程序有几种实现方式 Java 5以前实现多线程有两种实现方法:一种是继承Thread类:另一种是实现Runnable接口.两种方式都要通过重写run()方法来定义线程的行为,推荐使用后者,因为Java中的继承是单继承,一个类有一个父类,如果继承了Thread类就无法再继承其他类了,显然使用Runnable接口更为灵活. 补充:Java 5以后创建线程还有第三种方式:实现Callable接口,该接口中的

一大波Java来袭(二)异常处理

概要解析: 本章的知识点可以记为:1图+5关键字+先逮小的.后逮大的  一.基础 (一)定义 1.异常 是指在程序运行的时候发生的一些异常事件.良好的程序设计应该在异常发生的时候提供处理异常的方法,使得程序不会因为异常的发生而中断.因此Java提供的用于处理程序中错误的一种机制. 2.抛出异常throw java程序的执行过程中如出现异常事件,可以生成一个异常类对象(封装了异常事件的信息),被提交给java运行时系统. 简单理解为:推卸责任.马路上遇到了交通事故,不需要自己处理,而是拨打110,

Java数据类型(二)、Java运算符、流程控制

一.程序写作(创建对象的初始化过程) 1.目的/结果:输出一段话"..." 2.步骤: (1)创建一个基础类,main: (2)创建一块内存空间,用来存储这段话 ①先定义属性,name,sex,age等: ②再定义方法,需要重新创建新的class类,但不需要新的ma方法: (3)调用系统方法/库方法println,实现输出结果 ①在原有的类中创建新对象,将新的class类中的方法调用过来: ②运行,输出所有的内容. //---------------------------------

Java学习笔记二:初始化(一)

1.对象初始化 在使用 new 初始化对象时,系统通常使用默认的构造函数,这个构造函数没有返回值,格式为: public class InitializeTest { private int a; // 默认构造函数 public InitializeTest() { } // 自定义构造函数 public InitializeTest(int a) { this.a = a; } } 虽然在使用 new 创建实例时,返回了这个对象的引用,但是这个与没有返回值的void方法不同 //void方法

Java多线程(二)、线程的生命周期和状态控制(转)

Java多线程(二).线程的生命周期和状态控制 分类: javaSE综合知识点 2012-09-10 16:11 15937人阅读 评论(3) 收藏 举报 一.线程的生命周期 线程状态转换图: 1.新建状态 用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于新生状态.处于新生状态的线程有自己的内存空间,通过调用start方法进入就绪状态(runnable). 注意:不能对已经启动的线程再次调用start()方法,否则会出现java.lang.IllegalThreadSt

Java设计模式(二)-单例模式

单例模式建议保证某个对象仅仅只有一个实例,当只有一个对象来协调整个系统的操作时,在计算机系统中,线程池.缓存.日志对象.对话框.打印机.显卡的驱动程序对象常被设计成单例,总之,选择单例模式就是为了避免不一致状态,避免政出多头. 下面是单例模式的类图:包括的private和static修饰的实例instance.一个private的构造函数.一个static的getInstance函数 单例模式主要有三种:懒汉式单例.饿汉式单例.登记式单例三种 1.饿汉式单例:在类的初始化时候,自行创建了实例 c

【转】java提高篇(二)-----理解java的三大特性之继承

[转]java提高篇(二)-----理解java的三大特性之继承 原文地址:http://www.cnblogs.com/chenssy/p/3354884.html 在<Think in java>中有这样一句话:复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情.在这句话中最引人注目的是"复用代码",尽可能的复用代码使我们程序员一直在追求的,现在我来介绍一种复用代码的方式,也是java三大

Java数据结构之二叉搜索树

Java数据结构之二叉搜索树 1.二叉搜索树组成 二叉搜索树又称为二叉排序树,它或者是一颗空树,或者是一颗具有如下特性的非空二叉树,需要满足一下三个条件: (1)若它的左子树非空,则左子树上所有结点的关键字均小于根结点的关键字: (2)若它的右子树非空,则右子树上所有结点的关键字均大于(可以等于)根结点的关键字. (3)左子树右子树本身又各是一颗二叉搜索树 在算法描述中,均以结点值的比较来代表其关键字的比较,因为若结点的值为类类型时,该类必须实现系统提供的java.lang.comparable