中断线程

  • 当线程的run方法执行方法体中最后一条语句后,并经由执行return语句返回时,或者出现了在方法中没有捕获的异常时,线程将终止。
  • 没有可以强制线程终止的方法,然而,interrupt方法可以用来请求终止线程
  • 当对一个线程调用interrupt方法时,线程的中断状态将被置位。这是每个线程都具有的boolean标志。每个线程都应该不时地检查这个标志,以判断线程是否被中断。
  • 想要弄清中断状态是否被置位,首先调用静态的Thread.currentThread方法获得当前线程,然后调用isInterrupted方法。
while (!Thread.currentThread().isInterrupted() && more work do){
      //do more work
   }
  • 但是,如果线程被阻塞,就无法检测中断状态,这是产生InterruptedException异常的地方。
public class InterruptedExceptionTest {
    public static void main(String[] args) {
        new InterruptedExceptionTest().testSynchronized();
    }
    public void testSynchronized(){
            Runnable r = () -> {
                try {
                    System.out.println(Thread.currentThread().getName() + "线程开始了~~~");
                    sleep(1000);
                } catch (InterruptedException e) {
                    System.out.println(Thread.currentThread().getName() 
                    + "抛出了InterruptedException~~~");
                }
                System.out.println(Thread.currentThread().getName() + "线程结束了~~~");
            };
            Thread thread = new Thread(r);
            thread.start();
            thread.interrupt();
    }
}
  • 将interrupt()方法放置在run块内,无法产生InterruptedException,因为代码块中的语句是按照顺序执行的。(这句话是本人的猜测)
  • 当在一个被阻塞的线程(调用sleepwait)上调用interrupt方法时,阻塞调用将会被Interrupted Exception异常中断。
  • 没有任何语言方面的需求要求一个被中断的线程应该终止。中断一个线程不过是引起它的注意。被中断的线程可以决定如何响应中断。某些线程是如此重要以至于应该处理完异常后,继续执行,而不理会中断。但是,更普遍的情况是,线程将简单地将中断作为一个终止的请求。
  • 如果在中断状态被置位时调用sleep方法,它不会休眠。相反,它将清除(!)并抛出InterruptedException。因此,循环调用sleep,不会检测中断状态。
  • Thread类中的方法
void interrupt() 
//向线程发送中断请求。线程的中断状态将被设置为true。
//如果目前该线程被一个sleep调用阻塞,那么,InterruptedException被抛出
static boolean interrupted()
//测试当前线程(即正在执行这一命令的线程)是否被中断。
//注意,这是一个静态方法。当调用会产生副作用---它将当前线程的中断状态重置为false
boolean isInterrupted()
//测试线程是否被终止。不像静态的中断方法,这一调用不改变线程的中断状态
static Thread currentThread()
//返回代表当前执行线程的Thread对象
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值