interrupt-java多线程100例-5

本文详细介绍了Java中线程的中断机制,包括使用`interrupt()`方法设置中断标志,以及`sleep()`, `wait()`, `join()`方法在被中断时抛出异常的情况。通过示例代码展示了如何优雅地中断线程,强调了中断线程的正确处理方式,以保证程序的可控性和稳定性。
摘要由CSDN通过智能技术生成

在java中一个线程开始执行后,如果想停止它,在早起的时候我们可以使用stop方法。但是这个方法太暴力了,如果线程在处理一些很重要的工作时,可能只执行到一半,就被停止了。然程序执行结果很难控。

后来引入了interrupt方法。

当调用interrupt()方法后并不是把执行中的线程马上中断,而是给线程一个标记。

我们自己new出来的线程中可以自己加逻辑判断,是否是有其他线程想中断自己,如果是可以做出自己的选择是否中断,以及如何中断。

interrupt相关的方法有三个:

interrupt() -- 向某个线程发出中断信号,并将该线程标记为中断状态

isInterrupted() -- 返回该线程的中断状态

interrupted() -- 静态方法,返回当前线程的中断状态,并清除中断信号

但是在一个线程被标记为中断后,执行到下面方法是会自动抛出异常:

1. sleep()方法

2. wait()方法

3.join()方法

例子 1, sleep 方法可以被中断:

    @Test
    public void testInterruptSleep(){
        Thread t1 = new Thread(()->{
            try {
                Thread.sleep(20000);
            } catch (InterruptedException e) {
                logger.info("t1 have been interrupted when he is sleeping!");
            }
            logger.info("t1");
        });

        t1.start();
        t1.interrupt();
    }

执行结果:

例子 2, wait方法可以被中断。

   @Test
    public void testInterruptWait(){
        Thread t1 = new Thread(()->{
            try {
                synchronized(this){
                    wait();
                }
            } catch (InterruptedException e) {
                logger.info("t1 have been interrupted when he is waiting!");
            }
            logger.info("t1");
        });

        t1.start();
        t1.interrupt();
    }

执行结果:

例子3, join方法可以被中断,注意,在哪个线程中调用join方法阻塞按个线程,所以中断的应该是被阻塞的那个线程。如下面的例子阻塞的是t2,所以中断的也是t2.

 @Test
    public void testInterruptJoin(){
        Thread t1 = new Thread(()->{
               for (;;){
                Thread.yield();
               }

        });

        Thread t2 = new Thread(()->{
            try {
               t1.join();
            } catch (InterruptedException e) {
                logger.info("t2 have been interrupted when he is joining!");
            }
        });

        t1.start();
        t2.start();
        t2.interrupt();
        logger.info("this is the end");
    }

执行结果:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值