Java 多线程-线程中断

本篇文章的目的是了解ava 线程中的中断,通过对Java API中的 void interrupt()、boolean interrupted()、boolean isInterrupted() 的介绍来了解java 的线程中断 。

首先让我们了解一下什么是线程中断,java 的线程中断是一种线程状态,当一个线程处于中断状态时,调用该线程的sleep方法会抛InterruptedException异常。

那么问题来了,在什么情况下会出现线程中断呢?线程在运行的情况下是不会中断的,只有调用该线程的interrupt()方法时,线程才会处于中断状态,被中断的线程调用 sleep() 方时或线程处于sleep状态下调用线程的interrupt()方法时会抛InterruptedException异常。
我们用代码来测试一下,测试思路是我们创建一个线程,这种线程的run 方只有sleep() ,我们在线程sleep方调用时要线程处于中断状态。

在编写程序前我们先对相关的api做一下简单的介绍
void interrupt() ; // 向线程发送中断请求。线程的中断状态设置为true。
static boolean interrupted();// 测试当前线程是否处于中断状态,执行该方法会将线程的中断状态设置为false。
boolean isInterrupted() ;// 测试当前线程是否处于中断状态。
static void currentThread();// 获取当前线程。

/**
 * @author boo
 * 线程中断
 */
public class Dome01
{
    public static void main(String[] args) throws InterruptedException
    {
        final int threeSecond = 3000, oneSecond = 1000;
        Thread sleep = new Thread(new Runnable()
        {
            public void run()
            {
                try
                {   
                    Thread.currentThread().interrupted();
                    System.out.println(Thread.currentThread().getName() + " run Thread type " + Thread.currentThread().isInterrupted());
                    // 阻塞4秒
                    Thread.sleep(threeSecond + oneSecond); 
                } catch (InterruptedException e)
                {
                    System.out.println(Thread.currentThread().getName() + " 被中断了");
                    e.printStackTrace();
                }
            }
        }, "Thread-0");
        sleep.start();
        System.out.println(sleep.getName() + " 线程状态 " + sleep.isInterrupted());
        Thread.sleep(threeSecond);// 确保线程Thread-0 处于睡眠状态
        sleep.interrupt();
        System.out.println(sleep.getName() + " 执行interrupt 后的线程状态 " + sleep.isInterrupted());

    }

}

运行结果
Thread-0 线程状态 false
Thread-0 run Thread type false
Thread-0 被中断了
Thread-0 执行interrupt 后的线程状态 false
java.lang.InterruptedException: sleep interrupted
at java.lang.Thread.sleep(Native Method)
at com.sinosoft.settlement.maven.Dome01$1.run(Dome01.java:21)
at java.lang.Thread.run(Thread.java:745)
结果分析
测试思路很简单,无非是看看下面的代码谁先执行
1. Thread.currentThread().interrupted();
2. sleep.interrupt();
如果方法1 先与方法2执行,并且方法一所在线程在sleep 中调用了方法2 那么线程就会抛出InterruptedException异常。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值