zoukankan      html  css  js  c++  java
  • Java多线程-停止线程

    1、Java中终止正在运行线程的3中方法:

      1)run()方法完成后,正常终止

      2)使用 Thread.stop()强行终止

      3)使用 Thread.interrupt() 中断线程

    2、Thread.stop()

      这个方法发可以停止一个线程,但是最好不用它,因为这个方法是不安全的,而且已经被弃用(被注解为 @Deprecated)

      stop()方法的缺陷:

      1)强制让线程停止,可能使一些清理性的工作得不到完成。

      2)对锁定的对象进行了“解锁”,导致数据得不到同步的处理,出现数据不一致的问题。

    3、Thread.interrupt()

      直接调用不会终止正在运行的线程,需要加入一个判断才可以完成线程的停止。

      Thread.interrupt() 只是改变了当前线程的 interrupt 状态,并不是真的停止了当前线程的运行

      获取线程的 interrupt 状态有两个方法

      1)interrupted() 静态方法

      2)isInterrupted() 非静态方法

      区别:

      interrupted():获取当前线程的中断状态,执行后具有将状态标志清除为 false 的功能,所以连续两次调用 interrupted 第二次会输出 false

      isInterrupted(): 获取线程对象的中断状态,执行后,不清除中断状态

    4、Thread.interrupt() 配合“异常法”停止线程

    主要思想就是,获取到线程的中断状态为 true 之后,就抛出异常,结束线程代码块的执行

    public class InterruptTest {
        public static void main(String[] args) {
            try {
                Thread thread = new MyThread();
                thread.start();
                Thread.sleep(2000);
                thread.interrupt();
            } catch (InterruptedException e) {
                System.out.println("main catch");
                e.printStackTrace();
            }
        }
    }
    
    class MyThread extends Thread {
        @Override
        public void run() {
            super.run();
            try {
                for (int i = 0; i < 500000; i++) {
                    if (this.isInterrupted()) {
                        System.out.println("已经是停止运行状态了!我要退出了!");
                        throw new InterruptedException();
                    }
                    System.out.println("i = " + (i + 1));
                }
            } catch (InterruptedException e) {
                System.out.println("进MyThread.java 类 run 方法中的 catch 了!");
                e.printStackTrace();
            }
        }
    }

    执行结果如下:

      

  • 相关阅读:
    济南学习D1T5__HEAP
    快速计算C(n,r)
    快速阶乘算法
    济南学习D2T1__折纸带
    济南学习D3T1__线性筛和阶乘质因数分解
    栈与队列:栈的链式储存结构
    线性表应用:建立一个随机数 链表获得中间结点
    栈与队列应用:二进制转十进制 八进制 十六进制(栈)
    线性表:单链表基本操作代码
    线性表应用:魔术师发牌与拉丁(Latin)方阵(循环链表)
  • 原文地址:https://www.cnblogs.com/lkc9/p/12441214.html
Copyright © 2011-2022 走看看