java 多线程之线程的中断

测试interrupt中断线程

1.//首先创建Runnable接口的实现类
  class StopRunnable implements Runnable{
      @Override
      public void run(){
      // 利用死循环方法测试能不能停止程序
        while (!Thread.currentThread().isInterrupted()) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + " 测试停止线程");
        }
    }
    // 在main函数中创建线程测试一下
    public static void main(String[] args) {
        StopRunnable runnable = new StopRunnable();
        Thread t1 = new Thread(runnable);
        t1.start();
        // 给t1线程有执行的时间
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
         t1.interrupt();
        System.out.println("已经中断线程");

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("主线程结束");
    }
}

    测试结果:不能结束子线程
            实际上interrupt()方法
            设置了 isInterrupt 布尔值

    结论: 如果线程中有wait()或者sleep休眠
          这时调用interrupt方法 会抛出一个异常 InterruptedException
          并且清除中断状态

          如果线程中没有等待或者休眠 
          这时调用interrupt方法
          会设置中断状态(true/false)的改变         

测试interrupt清除状态

public static void main(String[] args) {

        InterruptThread t1 = new InterruptThread();
        InterruptThread t2 = new InterruptThread();
        t1.start();
        t2.start();

        for (int i = 0; i < 50; i++) {
            if (i == 25) {
                // 调用中断方法 来清除状态
                t1.interrupt();
                t2.interrupt();
                break;
            }
            System.out.println(i + "-------");
        }
        System.out.println("主线程结束");
    }
}

class InterruptThread extends Thread{
    public boolean isOver = false;
    @Override
    public synchronized void run() {
        while (true) {
            try {
                /*
                 * 线程1进来 带着锁 遇到wait方法
                 * 放弃cup的执行权 但是锁会还回去
                 * 线程2进来 又遇到wait方法() 也需要等待
                 * 相当于两个线程 都在等待中
                 * 进入就冷冻状态(中断状态)
                 * 解决冷冻(中断)状态 
                 * 调用interrupt方法 清除该状态
                 * 注意:wait方法必须用锁对象去调用
                 */
                this.wait();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + "...run");
        }
    }
小结:线程等待相当于放弃了cpu的执行权
    interrupt方法 尽量不要使用
    如果要停止线程 直接使用标示法
    只有遇到了 冷冻状态时 可以使用该方法
    强行清除该状态

标记法中断线程

3.常用的标记法停止线程
public static void main(String[] args) {
        StopRunnable runnable = new StopRunnable();
        Thread t1 = new Thread(runnable);
        t1.start();
        // 给t1线程有执行的时间
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        // 利用标记 停止线程
         runnable.isOver = true;
        System.out.println("已经中断线程");

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("主线程结束");
    }
}

class StopRunnable implements Runnable{
    public boolean isOver = false;
    @Override
    public void run() {
        // 利用死循环方法测试能不能停止程序
        while (!Thread.currentThread().isInterrupted()) {
            // 休眠一秒(写个死循环 让循环执行1秒结束)    
            long millis = System.currentTimeMillis();
            while (System.currentTimeMillis() - millis < 1000) {
            }
            System.out.println(Thread.currentThread().getName() + " 测试停止线程");
        }
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值