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 .... "); } }
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
基于Spring Boot DevTools实现开发过程优化
这篇文章主要介绍了基于Spring Boot DevTools实现开发过程优化,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下2020-09-09vue+springboot+shiro+jwt实现登录功能
这篇文章主要介绍了vue+springboot+shiro+jwt实现登录功能,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2022-04-04浅谈spring的重试机制无效@Retryable@EnableRetry
这篇文章主要介绍了浅谈spring的重试机制无效@Retryable@EnableRetry,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧2020-09-09
最新评论