java中如何停止一个正在运行的线程
如何停止一个正在运行的线程
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中的HashSet、LinkedHashSet集合解析
这篇文章主要介绍了Java中的HashSet、LinkedHashSet集合解析,与HashSet不同的是,LinkedHashSet在内部使用了一个双向链表来维护元素的顺序,因此它可以保持元素的插入顺序,这使得LinkedHashSet在需要保持元素顺序的场景下非常有用,需要的朋友可以参考下2023-11-11
SSM使用mybatis分页插件pagehepler实现分页示例
本篇文章主要介绍了SSM使用mybatis分页插件pagehepler实现分页示例,使用分页插件的原因,简化了sql代码的写法,实现较好的物理分页,非常具有实用价值,需要的朋友可以参考下2018-03-03
JavaIO BufferedReader和BufferedWriter使用及说明
这篇文章主要介绍了JavaIO BufferedReader和BufferedWriter使用及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2022-12-12
详解最简单易懂的Spring Security 身份认证流程讲解
这篇文章主要介绍了详解最简单易懂的Spring Security 身份认证流程讲解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2019-03-03


最新评论