• 多线程之线程停止


    结束线程有以下三种方法: (1)设置退出标志,使线程正常退出。 (2)使用interrupt()方法中断线程。 (3)使用stop方法强行终止线程(不推荐使用Thread.stop, 这种终止线程运行的方法已经被废弃,使用它们是极端不安全的!)

    一、使用退出标志 

    一般run()方法执行完,线程就会正常结束,然而,常常有些线程是伺服线程。它们需要长时间的运行,只有在外部某些条件满足的情况下,才能关闭这些线程。

    使用一个变量来控制循环,例如:最直接的方法就是设一个boolean类型的标志,并通过设置这个标志为true或false来控制while循环是否退出,代码示例:

    public class Demo8Exit {
      public static boolean exit = true;
      public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(new Runnable() {
          public void run() {
            while (exit) {
              try {
                System.out.println("线程执行!");
                Thread.sleep(100l);
             } catch (InterruptedException e) {
                e.printStackTrace();
             }
           }
         }
       });
        t.start();
        Thread.sleep(1000l);
        exit = false;
        System.out.println("退出标识位设置成功");
     }
    }

    结果如下:

    线程执行!
    线程执行!
    线程执行!
    线程执行!
    线程执行!
    线程执行!
    线程执行!
    线程执行!
    线程执行!
    线程执行!
    退出标识位设置成功

    二、使用interrupt()方法

    使用interrupt()方法来中断线程有两种情况:

    1、线程处于阻塞状态

    如使用了sleep,同步锁的wait,socket中的receiver,accept等方法时,会使线程处于阻塞状态。当调用线程的interrupt()方法时,会抛出InterruptException异常。阻塞中的那个方法抛出这个异常,通过代码捕获该异常,然后break跳出循环状态,从而让我们有机会结束这个线程的执行。

    2、线程未处于阻塞状态

    使用isInterrupted()判断线程的中断标志来退出循环。当使用interrupt()方法时,中断标志就会置true,然后break跳出循环状态。和使用自定义的标志来控制循环是一样的道理。

    public class Demo9Interrupt {
      public static boolean exit = true;
      public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(new Runnable() {
          public void run() {
            while (exit) {
              try {
                System.out.println("线程执行!");
                //判断线程的中断标志来退出循环
                if (Thread.currentThread().isInterrupted()) {
                  break;
               }
                Thread.sleep(100l); 
             } catch (InterruptedException e) {
                e.printStackTrace();
                //线程处于阻塞状态,当调用线程的interrupt()方法时,
                //会抛出InterruptException异常,跳出循环
                break;
             }
           }
         }
       });
        t.start();
        Thread.sleep(200l);
        //中断线程
        t.interrupt();
        System.out.println("线程中断了");
     }
    }

    其中一次运行结果如下:

    线程执行!
    线程执行!
    线程执行!
    线程中断了

    此时线程未处于阻塞状态。

    其中一次运行结果如下:

    线程执行!
    线程执行!
    线程中断了
    java.lang.InterruptedException: sleep interrupted
        at java.base/java.lang.Thread.sleep(Native Method)
        at com.zwh.Demo9Interrupt$1.run(Demo9Interrupt.java:20)
        at java.base/java.lang.Thread.run(Thread.java:844)

    此时线程处于阻塞状态。

  • 相关阅读:
    Java 多态
    Java 继承与抽象类
    Java 接口
    关于Oracle数据库故障诊断基础架构
    监控性能
    监视错误和警报
    内存管理参考
    使用自动内存管理
    内存架构概述
    关于内存管理
  • 原文地址:https://www.cnblogs.com/zwh0910/p/15868048.html
Copyright © 2020-2023  润新知