java中如何停止一个正在运行的线程

 更新时间:2025年01月08日 14:31:29   作者:夜夜流光相皎洁_小宁  
文章介绍了三种停止正在运行线程的方法:设置标志位、利用中断标志位和利用InterruptedException异常,这些方法可以帮助我们有效地控制线程的执行

如何停止一个正在运行的线程

1)设置标志位

如果线程的run方法中执行的是一个重复执行的循环,可以提供一个标记来控制循环是否继续

代码示例:

public class FunDemo02 {

    /**
     * 练习2:设计一个线程:运行10秒后被终止(掌握线程的终止方法)
     * @param args
     */
    public static void main(String[] args)  throws Exception{
        MyRunable02 runnable = new MyRunable02();
        new Thread(runnable).start();
        Thread.sleep(10000); // 主线程休眠10秒钟
        runnable.flag = false;
        System.out.println("main、  end ...");
    }
}

class MyRunable02 implements Runnable{

    boolean flag = true;

    @Override
    public void run() {
        while(flag){
            try {
                Thread.sleep(1000);
                System.out.println(new Date());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println(Thread.currentThread().getName() + " 执行完成");
    }
}

2)利用中断标志位

在线程中有个中断的标志位,默认是false,当我们显示的调用 interrupted方法或者isInterrupted方法是会修改标志位为true。

我们可以利用此来中断运行的线程。

代码示例:

package com.bobo.fundemo;

public class FunDemo07 extends Thread{

    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new FunDemo07();
        t1.start();
        Thread.sleep(3000);
         t1.interrupt(); // 中断线程 将中断标志由false修改为了true
        // t1.stop(); // 直接就把线程给kill掉了
        System.out.println("main .... ");
    }

    @Override
    public void run() {
        System.out.println(this.getName() + " start...");
        int i = 0 ;
        // Thread.interrupted() 如果没有被中断 那么是false 如果显示的执行了interrupt 方法就会修改为 true
        while(!Thread.interrupted()){
            System.out.println(this.getName() + " " + i);
            i++;
        }

        System.out.println(this.getName()+ " end .... ");

    }
}

3)利用InterruptedException异常

如果线程因为执行join(),sleep()或者wait()而进入阻塞状态,此时要想停止它,可以让他调用interrupt(),程序会抛出InterruptedException异常。

我们利用这个异常可以来终止线程。

package com.bobo;

public class FunDemo08 extends Thread{

    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new FunDemo08();
        t1.start();
        Thread.sleep(3000);
         t1.interrupt(); // 中断线程 将中断标志由false修改为了true
        // t1.stop(); // 直接就把线程给kill掉了
        System.out.println("main .... ");
    }

    @Override
    public void run() {
        System.out.println(this.getName() + " start...");
        int i = 0 ;
        // Thread.interrupted() 如果没有被中断 那么是false 如果显示的执行了interrupt 方法就会修改为 true
         while(!Thread.interrupted()){
        //while(!Thread.currentThread().isInterrupted()){
             try {
                 Thread.sleep(10000);
             } catch (InterruptedException e) {
                 e.printStackTrace();
				 break;
             }
             System.out.println(this.getName() + " " + i);
            i++;
        }

        System.out.println(this.getName()+ " end .... ");

    }
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java AOP知识详细介绍

    Java AOP知识详细介绍

    这篇文章主要介绍了Java AOP知识详细介绍的相关资料,需要的朋友可以参考下
    2017-01-01
  • 基于Spring Boot DevTools实现开发过程优化

    基于Spring Boot DevTools实现开发过程优化

    这篇文章主要介绍了基于Spring Boot DevTools实现开发过程优化,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • Java初始化List方法代码实例

    Java初始化List方法代码实例

    这篇文章主要介绍了Java初始化List方法代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • 删除JAVA集合中元素的实现代码

    删除JAVA集合中元素的实现代码

    有时候我们要删除集合中的某些元素,那么就可以参考下面的代码
    2013-07-07
  • SpringBoot 利用thymeleaf自定义错误页面

    SpringBoot 利用thymeleaf自定义错误页面

    这篇文章主要介绍了SpringBoot 利用thymeleaf自定义错误页面,帮助大家更好的理解和使用springboot 框架,感兴趣的朋友可以了解下
    2020-11-11
  • vue+springboot+shiro+jwt实现登录功能

    vue+springboot+shiro+jwt实现登录功能

    这篇文章主要介绍了vue+springboot+shiro+jwt实现登录功能,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • java多线程实现服务器端与多客户端之间的通信

    java多线程实现服务器端与多客户端之间的通信

    本篇文章主要介绍了java多线程实现服务器端与多客户端之间的通信,介绍了多线程来实现服务器与多线程之间的通信的基本步骤,有需要的小伙伴可以参考下。
    2016-10-10
  • java+socket实现简易局域网聊天室

    java+socket实现简易局域网聊天室

    这篇文章主要为大家详细介绍了java+socket实现简易局域网聊天室,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • Java中文件的读写方法之IO流详解

    Java中文件的读写方法之IO流详解

    这篇文章主要介绍了Java中文件的读写方法之IO流详解,本文中的代码所涉及到的路径或者文件都是本人的,大家得换成自己的,并且大家可以在网上自行找一些材料作为读入或者写入的材料,不过路径最好是英文的,不要包含中文,防止JVM读取失败
    2022-04-04
  • 浅谈spring的重试机制无效@Retryable@EnableRetry

    浅谈spring的重试机制无效@Retryable@EnableRetry

    这篇文章主要介绍了浅谈spring的重试机制无效@Retryable@EnableRetry,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09

最新评论