首页 > 编程语言 >java-重启异常断掉的线程和监控线程状态

java-重启异常断掉的线程和监控线程状态

时间:2024-09-25 16:22:36浏览次数:10  
标签:java Thread thread 09 断掉 50 2024 线程 25T13

java-重启异常断掉的线程和监控线程状态

背景

有一个线程,可能会因为异常而终止掉。为了监控这个线程,我又启动一个线程去监控。

主要代码

代码主要是由两个线程和两个可以产生异常的方法,内容跟简单,如下

import java.time.LocalDateTime;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class threadd {

    public static void main(String[] args) {
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                int i = 0;
                while (true) {
                    i++;
                    try {
                        Thread.sleep(1000);

                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }

                    if (i == 10) {
                        writeSth1();
                    }
                    System.out.println(LocalDateTime.now()+" "+i);
                }
            }
        };

        final Thread[] thread = {new Thread(runnable,"main thread")};
        thread[0].start();

        new Thread(new Runnable() {
                @Override
                public void run () {
                    while (true) {
                        try {
                            Thread.sleep(1000);
                            System.out.println(thread[0].getState());
                            if (!thread[0].isAlive()) {
                                System.out.println(LocalDateTime.now()+" 5秒后重启");
                                Thread.sleep(5000);

                                thread[0] = new Thread(runnable);
                                thread[0].start();
                            }
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            },"check thread").start();
    }

    public static void writeSth1  () {
        writeSth();
    }
    
    public static void writeSth() {
        System.out.println(9 / 0);
    }

}

打印结果

从下面结果看,等i等于10的时候程序就会执行writeSth1 而产生异常,此时线程状态是TERMINATED,接着重启又继续跑10次,符合预期

RUNNABLE
2024-09-25T13:49:59.347 1
TIMED_WAITING
2024-09-25T13:50:00.354 2
TIMED_WAITING
2024-09-25T13:50:01.360 3
TIMED_WAITING
2024-09-25T13:50:02.366 4
TIMED_WAITING
2024-09-25T13:50:03.370 5
TIMED_WAITING
2024-09-25T13:50:04.374 6
TIMED_WAITING
2024-09-25T13:50:05.377 7
TIMED_WAITING
2024-09-25T13:50:06.380 8
TIMED_WAITING
2024-09-25T13:50:07.384 9
TIMED_WAITING
Exception in thread "main thread" java.lang.ArithmeticException: / by zero
	at threadd.writeSth(threadd.java:76)
	at threadd.writeSth1(threadd.java:73)
	at threadd$1.run(threadd.java:27)
	at java.lang.Thread.run(Thread.java:855)
TERMINATED
2024-09-25T13:50:09.346 5秒后重启
RUNNABLE
2024-09-25T13:50:15.361 1
RUNNABLE
2024-09-25T13:50:16.365 2
RUNNABLE
2024-09-25T13:50:17.368 3
RUNNABLE
2024-09-25T13:50:18.374 4
RUNNABLE
2024-09-25T13:50:19.377 5
RUNNABLE
2024-09-25T13:50:20.381 6
RUNNABLE
2024-09-25T13:50:21.387 7
RUNNABLE
2024-09-25T13:50:22.392 8
RUNNABLE
2024-09-25T13:50:23.395 9
RUNNABLE
Exception in thread "Thread-0" java.lang.ArithmeticException: / by zero
	at threadd.writeSth(threadd.java:76)
	at threadd.writeSth1(threadd.java:73)
	at threadd$1.run(threadd.java:27)
	at java.lang.Thread.run(Thread.java:855)
TERMINATED
2024-09-25T13:50:25.406 5秒后重启

总结

  1. 核心代码是先定义一个thread变量,然后有异常的时候又实例化重新赋值
  final Thread[] thread = {new Thread(runnable,"main thread")};
  thread[0].start();


 if (!thread[0].isAlive()) {
     System.out.println(LocalDateTime.now()+" 5秒后重启");
     Thread.sleep(5000);

     thread[0] = new Thread(runnable);
     thread[0].start();
 }
  1. 不能在检测到线程的时候直接thread.start(),因为线程的生命周期已经没有,需要重新实例化,如果使用如下代码就会报错
  final Thread[] thread = {new Thread(runnable,"main thread")};
  thread[0].start();


 if (!thread[0].isAlive()) {
     System.out.println(LocalDateTime.now()+" 5秒后重启");
     Thread.sleep(5000);
     
     thread[0].start();
 }
  1. 其实最好的办法还是要对异常进行捕获,这也是最基本的

标签:java,Thread,thread,09,断掉,50,2024,线程,25T13
From: https://blog.csdn.net/m0_60688978/article/details/142521492

相关文章

  • Java面试-Redis篇(二)
    分布式锁抢劵场景分布式锁使用集群分布式锁使用代码展示setnx实现分布式锁Redis实现分布式锁主要利用Redis的setnx命令。setnx是SETifnotexists(如果不存在,则SET)的简写。redisson给锁续期代码实现publicvoidredisLock()throwsInterruptedException......
  • java+vue计算机毕设X钢材商贸公司网络购销管理系统【源码+程序+论文+开题】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着信息技术的飞速发展和互联网经济的蓬勃兴起,传统钢材商贸行业正面临前所未有的变革与挑战。X钢材商贸公司作为业内的佼佼者,长期以来依赖传统的购销......
  • java+vue计算机毕设爱心宠物中心管理系统【源码+程序+论文+开题】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着现代生活节奏的加快和城市化进程的推进,宠物已成为许多家庭不可或缺的重要成员,它们不仅为人们的生活带来了欢乐与陪伴,也促进了人与动物之间的情感......
  • java+vue计算机毕设IE绿色城市垃圾分类监管系统【源码+程序+论文+开题】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着城市化进程的加速,城市生活垃圾产生量急剧增加,垃圾分类已成为缓解“垃圾围城”困境、促进资源循环利用、实现绿色可持续发展的重要举措。然而,传统......
  • java实现角色及菜单权限
    在Java中实现角色及菜单权限通常涉及几个关键组件:用户(User)、角色(Role)、权限(Permission)以及它们之间的关系。下面我将概述一个基本的实现方案,包括数据库设计和代码层面的处理。1.数据库设计表设计用户表(users)user_id(主键)usernamepassword...角色表(roles)role_id(主键)role_name.......
  • 基于java实验室仪器设备管理系统的计算机毕设源码+论文
    摘要实验室仪器设备管理系统是一个基于Internet,采用B/S(Browser/Server,浏览器/服务器模式)模式,并根据现有的实验室仪器设备管理系统的现状而设计开发的服务于实验室仪器设备管理行业网络管理平台。本文以JSP为开发技术,实现了一个实验室仪器设备管理系统。该信息管理系统分为管理员......
  • 03.Java方法详解
    1.何谓方法?Java方法是语句的集合,在一起执行一个功能方法是解决一类问题的步骤的有序组合方法包含于类或对象中方法在程序中被创建,在其他地方被引用设计方法的原则:一个方法只完成1个功能,有利于后期扩展定义:类似c++里的函数,是一段用来完成特定功能的代码片段,一般定义......
  • Java 初学 day05
    Javaday051、面对对象1、面对对象和面对过程的区别面对过程思想:代表语言C语言功能开发中的每一步都是自己参与的面对对象思想:代表语言Java语言指的是不断创建对象,指挥对象完成事情的思想2、举例生活中的例子​ 接水:​ 面对过程思想:自己拿水杯,自己走到饮水机前,自......
  • java中的向下转型
    当我们构建一个父类引用指向子类对象的时候,该对象只能调用子类已经被重写的方法,而不能调用自己其他的方法,这时候就要用到向下转型classZi1extendsFu1{@Overridepublicvoidfun1(){System.out.println("李刚现在开始好好学习,天天向上!");}pub......
  • 最强Java100道核心面试题
    1.讲讲你理解的nio和bio的区别是啥,谈谈reactor模型。IO(BIO)是面向流的,NIO是面向缓冲区的BIO:BlockIO同步阻塞式IO,就是我们平常使用的传统IO,它的特点是模式简单使用方便,并发处理能力低。NIO:NewIO同步非阻塞IO,是传统IO的升级,客户端和服务器端通过Channel(通道)通......