java 线程意外中断重启处理办法

使用观察者模式

具体代码

首先 线程需要继承Observable

public class TestServer extends Observable implements Runnable {private static Logger logger = LoggerFactory.getLogger(TestServer.class);enum RunnableState {/*** RUNNING:运行 ERROR:异常 DOWN:正常结束*/RUNNING, ERROR, DOWN}/*** 发送通知* * @param event*            通知的内容*/private void notifyChange(final RunnableEvent event) {// 前面说过 JDK自带的 需要每次设置一次状态,代表当前内容更改了System.out.print("notifyChange");super.setChanged();super.notifyObservers(event);}static class RunnableEvent {private final RunnableState state;private final Thread thread;private final Throwable cause;RunnableEvent(RunnableState state, Thread thread, Throwable cause) {this.state = state;this.thread = thread;this.cause = cause;}RunnableState getState() {return state;}public Thread getThread() {return thread;}Throwable getCause() {return cause;}}@Overridepublic void run() {try {while (true) {throw new RuntimeException("故意抛出错误");}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();notifyChange(new RunnableEvent(RunnableState.ERROR,Thread.currentThread(), e));System.out.print("抛出异常");}}public static void main(String args[]) {TestServer ts = new TestServer();ObserverListener listen = new ObserverListener();ts.addObserver(listen);    }
}

然后  写一个监听类ObserverListener   实现 Observer

public class ObserverListener implements Observer {/*** 避免多线程锁竞争*/private static final Object LOCK = new Object();@Overridepublic void update(Observable observable, Object runnableEvent) {synchronized (LOCK) {TestServer.RunnableEvent event = (TestServer.RunnableEvent) runnableEvent;if (event != null) {if (event.getCause() != null) {System.out.println("The Runnable ["+ event.getThread().getName()+ "] process failed and state is "+ event.getState().name());event.getCause().printStackTrace();} else {System.out.println("The Runnable ["+ event.getThread().getName()+ "] data changed and state is "+ event.getState().name());}}}}
}

需要注意的是  在New线程类TestServer的时候

TestServer ts = new TestServer();
        ThreadListener listen = new ThreadListener();
        ts.addObserver(listen);

必须加上  addObserver(listen)  这是TestServer  继承Observable而来的,如果不加上则监听不到

在监听类中,可以执行你想执行的结果,比如重启线程

System.out.println("RunThread死机");

TestServer ts = new TestServer();
        ts.addObserver(this);
        new Thread(ts, "tttt").start();

System.out.println("RunThread重启");

java 线程意外中断重启处理办法(观察者模式)相关推荐

  1. java线程的中断(interrupt)

    一个线程在未正常结束之前, 被强制终止是很危险的事情. 因为它可能带来完全预料不到的严重后果比如会带着自己所持有的锁而永远的休眠,迟迟不归还锁等. 所以你看到Thread.suspend, Threa ...

  2. java 线程 异常中断_java多线程并发之旅-19-InterruptedException 中断异常处理及中断机制...

    引言 如果对 Java 中断没有一个全面的了解,可能会误以为被中断的线程将立马退出运行,但事实并非如此. 中断机制是如何工作的?捕获或检测到中断后,是抛出 InterruptedException 还 ...

  3. java 线程池 中断_如何中断(interrupt)线程(thread)(线程池的线程中断我的理解是一个意思)...

    1.概述基本实现是,通过 InterruptedException 异常来终止程序,至于线程什么时候终止,只能由jvm来决定了,若理解的不到位,欢迎大牛们指点 2.code 如下 package co ...

  4. java线程安全问题原因及解决办法

    1.为什么会出现线程安全问题 计算机系统资源分配的单位为进程,同一个进程中允许多个线程并发执行,并且多个线程会共享进程范围内的资源:例如内存地址.当多个线程并发访问同一个内存地址并且内存地址保存的值是 ...

  5. Java线程机制学习

    前面的文章中总结过Java中用来解决共享资源竞争导致线程不安全的几种常用方式: synchronized: ReentrantLock: ThreadLocal: 这些都是在简单介绍了基本用法的基础上 ...

  6. java 线程机制_Java线程机制学习

    前面的文章中总结过Java中用来解决共享资源竞争导致线程不安全的几种常用方式: synchronized: ReentrantLock: ThreadLocal: 这些都是在简单介绍了基本用法的基础上 ...

  7. java 线程interupt stop(dep)

    java 线程interupt stop(dep) https://blog.csdn.net/zbw18297786698/article/details/53432879/ 1.Java中API自 ...

  8. java线程怎么重启_如何在Java中启动/停止/重启线程?

    10 个答案: 答案 0 :(得分:41) 一旦线程停止,您就无法重新启动它.但是,没有什么可以阻止您创建和启动新线程. 选项1:创建一个新线程,而不是尝试重新启动. 选项2:而不是让线程停止,让它等 ...

  9. 如何中断JAVA线程

    如何中断JAVA线程 程序是很简易的.然而,在编程人员面前,多线程呈现出了一组新的难题,如果没有被恰当的解决,将导致意外的行为以及细微的.难以发现的错误.       在本篇文章中,我们针对这些难题之 ...

  10. Java线程中断机制-如何中断线程

    Java线程中断机制-如何中断线程 版权声明:本文为博主原创文章,欢迎指正或者转载. https://blog.csdn.net/qq_38663729/article/details/7823264 ...

最新文章

  1. 如何让网页不受电信114劫持
  2. ADO.NET Entity Framework如何:通过每种类型一个表继承以定义模型(实体框架)
  3. JAVA中方法的类型转换_Java中几种常用数据类型之间转换的方法
  4. label里面的文字换行_批量识别图中文字自动命名,让你1秒找到骚图!太强大了!...
  5. 具有自适应空间强度约束和隶属度链接的鲁棒模糊c均值聚类算法
  6. php v9视频教程,PHPCMS V9二次开发视频教程全集
  7. c# 调用浏览器打开页面
  8. 【无线芯片解读】2.4G专题:(SI24R1简版)Ci24R1
  9. 一阶系统开环传递函数表达式_自动控制总结:第五章、线性系统的校正方法
  10. uni-app本站点必须要开启JavaScript才能运行
  11. 时制转换时的电话账单
  12. 蛋白质二级结构预测工具psipred安装使用
  13. 毕业三周年,又一个离别季
  14. 2022,6G发展确已升温
  15. 算法系列之二十:计算中国农历(一)
  16. 量子计算机论坛,IBM量子计算机取得重大突破
  17. 设计模式之禅学习总结
  18. CMOS图像传感器的参数和评价标准
  19. 职场礼仪常识、职场注意事项
  20. jQuery翻牌子抽奖效果(已知结果)

热门文章

  1. fgo服务器维护 石头,FGO发石头玩家的四种表现 第三种要注意了
  2. 怎样快速修改论文格式-使用人工智能技术助手
  3. . mindoc linux amd64,搭建minDoc文件接口服务器
  4. qnx 设备驱动开发_一种QNX系统的USB驱动加载方法与流程
  5. python xps_XPS 15 9560 安装 Ubuntu 18.04
  6. 极大似然估计法(Maximum likelihood estimation, MLE)
  7. 微信PC版怎么安装旧版本
  8. onlyoffice 在线编辑
  9. java+MySQL基于ssm的公文流转关管理系统
  10. 修改Linux系统最大TCP连接数限制