Java Thread.sleep的InterruptedException 线程阻塞 线程中断

1.1.1 Thread.sleep抛异常

当某线程A处于Sleep状态时,另一个线程B调用了B.interrupt()方法,打断了A的Sleep过程,则A的Sleep会抛出异常。使用Catch后,线程不会等待Sleep时间,而是会立即执行。

下面的例子中,线程1的Sleep会被线程2打断,所以线程1的Sleep会抛异常。

public class SleepException {
    public static void main(String[] args) {      
        final Thread t1 = new Thread(){ 
           public void run() {
            System.out.println("Thread1 start!");
            while (true){
                System.out.println("Thread1 sleep start!");
                    try { 
                        Thread.sleep(10000); 
                    } catch (InterruptedException e) { 
                      System.out.println("Thread1 sleep exception e="+e.getMessage());
                        e.printStackTrace(); 
                    }
            }
           } 
       }; 

       Thread t2 = new Thread() { 
           public void run() {
            System.out.println("Thread2 start!");
            while (true){
                System.out.println("Thread2 sleep start!");
                    try { 
                        Thread.sleep(2000); 
                    } catch (InterruptedException e) {
                      System.out.println("Thread2 sleep exception e="+e);
                        e.printStackTrace(); 
                    } 
                    t1.interrupt();
            }
           } 
       }; 
        t1.start(); 
        t2.start(); 
    } 
}

1.1.2 Thread.interrupt的中断信号
Thread.interrupt()方法不会中断一个正在运行的线程。它的作用是,在线程受到阻塞时抛出一个中断信号,这样线程就得以退出阻塞的状态。更确切的说,如果线程被Object.wait,Thread.join和Thread.sleep三种方法之一阻塞,那么,它将接收到一个中断异常(InterruptedException),从而提早地终结被阻塞状态。

interrupt方法并不是强制终止线程,它只能设置线程的interrupted状态,而在线程中一般使用一下方式:
while (!Thread.currentThread().isInterrupted() && more work to do)

{…}

  1. 调用A.interrupt时,会设置A的isInterrupted状态,通知A有重要的事情需要处理了。

  2. 具体A怎么处理,取决于A自己。也许是退出,也可以继续执行。

  3. 如果线程被Object.wait, Thread.join和Thread.sleep三种方法之一阻塞,那么,它将接收到一个中断异常(InterruptedException),从而提早地终结被阻塞状态。以便及时对isInterrupted状态进行处理。

  4. Thread.interrupted()方法可以判断本线程是否收到了中断信号,并进行处理。此方法是读清的,下一次再判断就为false。直到收到新的中断信号。

  5. Thread.currentThread().isInterrupted()方法是非读清的。

  6. 中断方法interrupt是异步的,有一定延时的。A程序对B程序中断,A程序在走了几行后,B才能感知到中断。

例子:

public class SleepException {
    public static void main(String[] args) {
        final Thread t1 = new Thread() {
            public void run() {
                System.out.println("Thread1 start!");
                while (true) {
                    if (Thread.currentThread().isInterrupted()){
                        System.out.println("Thread1 isInterrupted 1");
                    } else {
                        // System.out.println("Thread1isInterrupted 1 false");
                    }
                    if (Thread.currentThread().isInterrupted()){
                        System.out.println("Thread1 isInterrupted 2");
                    }
                    if (Thread.interrupted()) {
                        System.out.println("Thread1 interrupted 3");
                    }
                    if (Thread.interrupted()) {
                        System.out.println("Thread1 interrupted 4");
                    }
                    if (Thread.currentThread().isInterrupted()){
                        System.out.println("Thread1 isInterrupted 5");
                    }
                }
            }
        };

        Thread t2 = new Thread() {
            public void run() {
                System.out.println("Thread2 start!");
                while (true) {
                    System.out
                            .println("=================Thread2sleep start===============!");
                    try {
                        Thread.sleep(4000);
                    } catch (InterruptedException e) {
                        System.out.println("Thread2 sleep exception e=" + e);
                        e.printStackTrace();
                    }

                    t1.interrupt();
                }
            }
        };
        t1.start();
        t2.start();
    }
}
  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值