Java线程中断

首先

一个线程不应该由其他线程来强制中断或停止,而是应该由线程自己自行停止。所以Thread.stop,Thread.suspend,Thead.resume都已经被废弃了。

其次

在Java中没有办法立即停止一条线程,然而停止线程却显得尤为重要,如取消一个耗时操作。

因此,Java提供了一种用于停止线程的协商机制一中断,也即中断标识协商机制。

中断只是一种协作协商机制,Java没有给中断增加任何语法,中断的过程完全需要程序员自己实现。若要中断一个线程,你需要手动调用该线程的interrupt方法,该方法也仅仅是将线程对象的中断标识设成true;接着你需要自己写代码不断地检测当前线程的标识位,如果为true,表示别的线程请求这条线程中断,此时究竟该做什么需要你自己写代码实现。

每个线程对象中都有一个中断标识位,用于表示线程是否被中断;该标识位为true表示中断,为false表示未中断:通过调用线程对象的interrupt方法将该线程的标识位设为true: 可以在别的线程中调用,也可以在自己的线程中调用。

中断的相关API方法之三大方法说明。

方法一:

public void interrupt() 实例方法interrupt()仅仅是设置线程的中断状态为true,发起一个协商而不会立刻停正线程。

① 如果线程处于正常活动状态,那么会将该线程的中断标志设置为 true,仅此而已。

被设置中断标志的线程将继续正常运行,不受影响。

所以, interrupt) 并不能真正的中断线程,需要被调用的线程自己进行配合才行。

②如果线程处于被阻塞状态(例如处于sleep, wait, join 等状态),在别的线程中调用当前线程对象的interrupt方法,那么线程将立即退出被阻塞状态,并抛出一个InterruptedException异常。

③如果该线程阳塞的调用wait(), wait(long)或wait(long, int)的方法0bject类的join(), join(long),join(long, int),sleep(long), 或sleep(long, int),这个类的方法,那么它的中断状态将被清除(设置为false),并目将收到InterruptedException

方法二:

public static boolean interrupted() 静态方法,Thread.interrupted():判断线程是否被中断并清除当前中断状态(就是把中断标志改完false)。这个方法做了两件事。

  1. 返回当前线程的中断状态,测试当前线程是否已被中断

  1. 将当前线程的中断状态清零并重新设置为false,清楚线程的中断状态

方法三:

public boolean islnterrupted() 实例方法,判断当前线程是否被中断(通过检查中断标志位)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值