`
talentluke
  • 浏览: 606180 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Java线程监听,意外退出线程后自动重启

阅读更多
摘自 http://my.oschina.net/reachwang/blog/296194
摘要  观察者模式:定义对象之间的一种一对多的依赖关系,当对象的状态发生改变时,所有依赖于它的对象都得到通知并且被自动更新。   观察者模式在JDK中有现成的实现,java.util.Obserable,如何进行监听线程,请看例子:

 

被监听的线程类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package cn.std.test;
import java.util.Observable;
import cn.std.util.DateUtil;
public class RunThread extends Observableimplements Runnable{
    // 此方法一经调用,立马可以通知观察者,在本例中是监听线程
    publicvoid doBusiness(){
        if(true){
            super.setChanged();
        }
        notifyObservers();
    }
    @Override
    publicvoid run() {
        intc = 0;
        while(true){    //模拟线程运行一段时间之后退出
            System.out.println("Runing- "+c+" "+DateUtil.getStdDateTime());
            try{
                Thread.sleep(2000);
            }catch (InterruptedException e) {
                e.printStackTrace();
                doBusiness();
                break;
            }
            c++;
            //模拟抛出异常
            try{
                if(c== 4){
                    Stringstr = null;
                    str.length();//此处将会抛出空指针异常
                }
            }catch (Exception e) {
                e.printStackTrace();
                doBusiness();//在抛出异常时调用,通知观察者,让其重启线程
                break;//异常抛出之后,一定要跳出循环,保证将线程送进地狱
            }
        }    
    }
    publicstatic void main(String[] args) {
        RunThreadrun = new RunThread();
        Listener listen = new Listener();
        un.addObserver(listen);
        newThread(run).start();
        //run.doBusiness();
    }
}

 

被监听的线程需要继承Observable类,继承之后轻松变身为被观察者doBusiness方法,此处可以加上你的业务处理内容,接下来是Listener

 

1
2
3
4
5
6
7
8
9
10
11
12
13
package cn.std.test;
import java.util.Observable;
import java.util.Observer;
public class Listener implements Observer{
    @Override
    publicvoid update(Observable o, Object arg) {
        System.out.println("RunThread死机");
        RunThreadrun = new RunThread();
        run.addObserver(this);
        newThread(run).start();
        System.out.println("RunThread重启");
    }
}

 

很简单,只要实现Observer接口,实现其update方法,在方法内部重启线程

分享到:
评论

相关推荐

    Java线程监听,意外退出线程后自动重启的实现方法

    Java线程监听、意外退出线程后自动重启的实现方法 Java线程监听是Java编程中的一种重要机制,用于监控和管理线程的生命周期。在实际开发中,我们经常会遇到线程意外退出的情况,例如网络异常、资源不足等原因导致...

    java程序自动重新启动

    通过以上分析,我们可以推测这个程序的工作流程大致如下:Watch.java线程持续监控某些条件(例如日志文件、程序状态文件),当满足特定条件(比如出现错误日志)时,通知主程序Test.java。Test.java接收到信号后,...

    Windows下设置守护进程JAR包挂掉自动重启,bat文件(已完美测试)

    它通过一个循环监控Java程序进程,如果检测到程序异常退出,会自动重启程序。同时具有可配置的重启次数和重启间隔时间。 这个小巧但实用的bat脚本实现了一个功能强大的守护进程机制,其可以广泛应用于各种Java程序的高...

    自己写的JAVA锁屏源码

    2. 另外,还需要考虑程序异常退出或系统意外重启的情况,如何恢复到正确状态也是设计的一部分。 八、测试与调试 1. 测试锁屏功能的全面性和稳定性,确保在各种场景下都能正常工作,例如在不同的操作系统版本上运行...

    Java之——类热加载

    传统的Java应用程序在启动时,由JVM(Java虚拟机)通过类加载器将类加载到内存中,一旦加载完成,除非程序退出,否则这些类通常不会被重新加载。然而,在开发过程中,我们可能希望在不重启应用的情况下,对已加载的...

    Java锁屏软件 系统锁

    Java提供了异常处理框架,允许程序员通过try-catch-finally语句块来捕获和处理可能出现的错误,保证软件在遇到问题时能够优雅地恢复或退出。 8. **日志记录**: 为了便于调试和维护,锁屏软件应包含日志记录功能,...

    java面试题实践收集及答案详解

    - **在服务器重启后**:重启服务器会清空所有的session。 - **意外故障**:例如服务器崩溃或网络中断。 #### 二、Java进阶知识点 ##### 1. final关键字的使用 - **不可变性**:声明变量或类成员为final后,其值不...

    android退出程序

    ### Android 退出程序知识点解析 #### 一、概述 在Android开发中,有时我们需要实现一个功能,即当用户连续两次点击返回键时,应用程序能够完全退出。这种需求常见于一些较为复杂的多Activity应用中,目的是为了...

    Android 实现彻底退出自己APP 并杀掉所有相关的进程

    这将杀死当前应用的进程,但是需要注意的是,ActivityManager 会监听进程的状态,一旦发现进程被非正常 Kill,它将会试图去重启这个进程。这就是为什么,有时候当我们试图这样去结束掉应用时,发现 app 会自动重新...

    简单swing电话本

    - 考虑到程序重启后仍能保留数据,开发者可能使用了文件系统或者数据库来保存联系人信息。可能的方式包括序列化对象到磁盘,或者使用SQLite这样的轻量级数据库。 5. **文件I/O操作** - 在读取和写入联系人信息时...

    黑马程序员 安卓学院 万元哥项目经理 分享220个代码实例

    |--时间java常用应用 |--时间之handle记时器 |--时间之time的用法得到特定时间的long值 |--时间之之定时任务TimerTask |--时间之倒计时CountDownTimer |--时间之当前时间动态显示 |--时间之自动任务...

    MyDaemonProcess

    守护进程(Daemon)在Unix系统中是指一种在后台运行并持续存在的程序,而在Android中,守护进程常用于保持应用服务即使在用户退出应用后也能持续运行。这种技术对于实现后台任务、定时任务或者持续提供服务的应用...

    安卓带进度条的升级更新

    6. **程序退出与重启**:在更新过程中,如果应用需要退出,应该保存当前的更新进度,以便下次启动时恢复。这需要在退出前将进度信息写入持久化存储,并在启动时读取这些信息,继续执行更新流程。 在这个过程中,...

    Eclipse插件开发培训_资源管理(进阶).ppt

    Job是Eclipse线程支持的一部分,用于执行异步任务,而ISchedulingRule则用于控制任务执行的调度,防止冲突,类似于Java的`synchronized`关键字,但其作用范围更为灵活。 Eclipse的Batching操作是资源管理中的关键...

    郭克华 J2ME 视频教程学习笔记(终稿)(密码:123456).pdf

    - **对象存储**:将Java对象序列化后存入RecordStore。 #### 第十六章 RMS编程2:高级知识 **16.1 遍历记录集** - **遍历操作**:通过迭代器遍历所有记录。 **16.2 记录监听** - **监听器**:用于监听记录的增...

    android下载管理

    使用DownloadManager的好处在于,即使应用退出或设备重启,下载任务也能继续进行。 二、DownloadManager API 要使用DownloadManager,首先需要获取其系统的实例,通过以下代码实现: ```java DownloadManager ...

    SharedPreferences基本介绍

    1. **持久化存储**:SharedPreferences将数据存储在XML文件中,当应用退出或设备重启后,数据依然可以被保留。 2. **简单易用**:通过提供的API,开发者可以方便地进行数据的读取和写入操作。 3. **安全性**:相比于...

    JSP 在线人数统计的实现

    当用户登录后,服务器会为该用户创建一个Session对象,存储用户的登录信息,直到Session过期或用户退出。 2. **统计原理** 在线人数统计的基本思路是利用Session来记录活跃用户。每当有用户访问网站时,如果该用户...

    Android程序研发源码Android 秒表源码.rar

    6. **广播接收器**:在某些情况下,可能希望在设备重启后继续之前暂停的秒表。这可以通过注册一个`BroadcastReceiver`监听设备开机广播,然后恢复秒表的状态。 7. **数据持久化**:如果需要在应用退出后还能记住...

    android基础知识

    IntentService是一种特殊的Service,简化了异步任务的处理流程,自动管理线程和生命周期。 #### 28. 屏幕旋转与Activity生命周期 当屏幕旋转时,系统默认会重启Activity,这会影响到Activity的生命周期,需要注意...

Global site tag (gtag.js) - Google Analytics