`

监听线程死机,猝死 --使用观察者模式

 
阅读更多

某日,天朗气清,回公司,未到9点,刷微博,顿觉问题泛滥,惊恐万分!

前一天写了一个微博爬行程序,主要工作原理就是每隔2分钟爬行一次微博,获取某N个关注朋友微博数量,然后将其保存起来,2分钟之后再次爬行,再取其微博数量,与2分钟前保存的微博数量比较,如果数量增加,说明该好友在此2分钟之内发布微博,如果数量减少,则是删除微博。最后将爬行结果发送到指定手机上,作为通知!

 

今天看微博时发现自己关注的朋友发布了微博,然而自己手机却没有收到报警消息,查看爬行日志发现,在凌晨6点钟时,公司网络曾经断网,导致网络堵塞,程序在爬行的时候抛出网络异常 UnknownHostException,此时线程就已经死掉,猝死。为解决此问题,现有如下需求:线程死掉之后会自动重启。

 

常规解决办法有2种:

     1,开启另外一个线程,监听爬行线程,使用线程之间的通信,一般是消费者模式,如果爬行线程死掉之后,监听线程会收到通知,但是如果监听线程先死掉,那么系统也就挂了!

     2,使用心跳机制,爬行线程每隔一段时间往另一服务器进程发送数据包,如果服务器进程长时间没有收到心跳包,则说明爬行线程已经死机!

 

两种方法都有合适的使用范围,但是对于监听线程猝死这种情况,个人觉得是使用观察者模式比较合适!现说明一下观察者模式。

 

观察者模式:定义对象之间的一种一对多的依赖关系,当对象的状态发生改变时,所有依赖于它的对象都得到通知并且被自动更新。

 

观察者模式在JDK中有现成的实现,java.util.Obserable,如何进行监听线程,请看例子:

 

被监听的线程类

package cn.std.test;

import java.util.Observable;

import cn.std.util.DateUtil;

public class RunThread extends Observable implements Runnable{
	
        // 此方法一经调用,立马可以通知观察者,在本例中是监听线程
	public void doBusiness(){
		if(true){
			super.setChanged();
		}
		notifyObservers();
	}
	
	@Override
	public void run() {
		int c = 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){
					String str = null;
					str.length();//此处将会抛出空指针异常
				}
			} catch (Exception e) {
				e.printStackTrace();
				doBusiness();//在抛出异常时调用,通知观察者,让其重启线程
				break;//异常抛出之后,一定要跳出循环,保证将线程送进地狱
			}
		}    
	}

	public static void main(String[] args) {
		RunThread run = new RunThread();
               
        Listener listen = new Listener();
		run.addObserver(listen);
		new Thread(run).start();
		//run.doBusiness();
	}
}

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

package cn.std.test;

import java.util.Observable;
import java.util.Observer;

public class Listener implements Observer{

	@Override
	public void update(Observable o, Object arg) {
		System.out.println("RunThread 死机");
		RunThread run = new RunThread();
		run.addObserver(this);
		new Thread(run).start();
		System.out.println("RunThread 重启");
	}
}

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

 

分享到:
评论
2 楼 sziitjiang 2012-10-23  
87869170 写道
感觉很神奇,不知道有这样的做法。
做java 3年的飘过...

呵呵,您是前辈,还请多指点,呵呵..
1 楼 87869170 2012-10-23  
感觉很神奇,不知道有这样的做法。
做java 3年的飘过...

相关推荐

    设计模式-观察者

    7. **其他变体**:除了基本的观察者模式,还有复合观察者模式,允许一个观察者对象包含多个观察者,以及异步观察者模式,通知过程在不同的线程中执行,以避免阻塞主线程。 在实际开发中,理解并熟练运用观察者模式...

    设计模式-观察者模式 基于MFC实现的消息监听机制

    基于MFC实现的消息监听机制,利用了设计模式中的观察者模式,对线程间的同步做了优化,以及可以选择消息的发送类型:同步或异步发送。对于监听者而言在注册监听的同时可以选择监听的消息类型,避免了发送者发送的...

    解决Spring session(redis存储方式)监听导致创建大量redisMessageListenerContailner-X线程问题

    在本文中,我们主要探讨了在使用Spring Session以及Redis作为存储方式时,由于消息监听导致创建大量线程的问题及其解决方案。我们将从Spring Session的基础知识、Redis在Spring Session中的作用、监听机制导致线程...

    Java线程池及观察者模式解决多线程意外死亡重启问题

    然后,每个线程在执行过程中都可以作为一个观察者,监听自身是否出现异常。一旦线程意外死亡,线程池的管理者(也可能是另一个观察者)会接收到这个事件,并采取行动,如重新启动该线程或者执行其他的恢复策略。 ...

    Java设计模式-第22章-观察者模式.ppt

    Java设计模式中的观察者模式(Observer Pattern)是一种对象行为型模式,它定义了一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这种模式常用于事件处理和实时...

    java监听者模式三个实例

    在这个"java监听者模式三个实例"中,我们将深入探讨如何使用监听者模式来实现事件驱动的编程。 1. **监听者模式的基本概念** - **观察者(Observer)**:即监听者,它定义了接口用于接收被观察者的通知。 - **被...

    iOS 设计模式 观察者模式

    在`ObserverPattern-master`这个压缩包中,可能包含了一个关于观察者模式的示例项目,里面可能通过创建自定义的观察者和被观察者类,展示了如何在不使用系统提供的通知或KVO的情况下实现观察者模式。通过分析和学习...

    使用MFC实现观察者模式(Observer)同时兼顾多窗口之间传值

    在实际应用中,`TestNotify`可能是一个测试程序,用于演示如何在MFC中使用观察者模式进行事件监听和多窗口之间的值传递。这个程序可能包含了创建观察者和被观察者对象,添加观察者到被观察者列表,以及在消息触发时...

    java23种设计模式之观察者模式

    例如,在Java Swing和JavaFX中,组件之间的交互就大量使用了观察者模式。 ### 5. 扩展与变体 观察者模式有多种变体,如发布/订阅模式、模型-视图-控制器(MVC)架构中的模型与视图之间的关系,以及Java的事件监听...

    Java内置观察者模式

    观察者模式(Observer Pattern)是设计模式中的一种行为模式,它允许一个对象,当其状态发生改变时,能够自动通知所有依赖它的其他对象。在Java中,这种模式已经被内置到语言核心,使得开发者可以轻松地实现事件驱动...

    java中监听机制,以及观察者设计模式

    Java中的监听机制与观察者设计模式是编程中重要的概念,它们在软件开发中扮演着关键的角色,尤其是在构建可扩展和可维护的系统时。这里,我们将深入探讨这两个主题,并通过实例来阐述它们的工作原理和应用。 首先,...

    观察者模式模版和例子

    3. **事件驱动**:观察者模式非常适合构建事件驱动的系统,比如GUI框架,当用户进行交互时,事件可以被广播给多个监听者。 在编程实践中,观察者模式常用于以下场景: - **GUI组件**:当用户界面中的一个元素发生...

    Android监听——回调模式与观察者模式

    而在观察者模式中,Java的Observer和Observable接口提供了标准的观察者模式实现,但Android的BroadcastReceiver并不直接使用这两个接口,而是通过注册和接收Intent广播来实现观察者模式。 至于"压缩包子文件的文件...

    Cocos2d-x观察者模式其实很简单!!--之游戏开发《赵云要格斗》

    在本项目"赵云要格斗"中,开发者使用了观察者模式来实现游戏中的事件处理和对象间的通信,使得代码结构更加清晰,易于维护。观察者模式是设计模式中的一种,它定义了对象之间的一对多依赖关系,当一个对象的状态发生...

    观察者模式1Demo

    观察者模式是软件设计模式中的一种行为模式,它在对象之间定义了一种一对多的依赖关系,当一个对象的状态发生改变时,所有...在实际开发中,如UI组件监听模型数据变化、事件驱动编程等,观察者模式都扮演着重要的角色。

    守护线程--源码--练手

    守护线程,也被称为后台线程,是Java编程语言中的一种特殊线程类型。它们的主要特点是在所有非守护线程(用户线程)结束后,守护线程才会被系统强制结束。在Windows环境下,通常我们使用服务来实现长期运行的任务,...

    观察者模式(附代码和解释)下载

    观察者模式是一种常用的软件设计模式,它定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象。当这个主题对象的状态发生变化时,会通知所有的观察者对象,使其能够自动更新自己。这种模式适用于实现...

    多线程(21)观察者模式1

    下面将详细解释如何使用观察者模式来跟踪和管理线程的生命周期。 首先,我们需要定义一个表示任务生命周期的枚举类型接口`Observable`,如代码所示,这个接口包含`STARTED`、`RUNNING`、`DONE`和`ERROR`四个状态,...

    IOS 观察者模式实例Demo

    使用`[NSNotificationCenter defaultCenter]`获取全局的通知中心,它是观察者模式中的主题。 2. 注册观察者(Observer): 使用`addObserver:selector:name:object:`方法将观察者(通常是控制器或任何需要监听...

    观察者模式

    5. **应用场景**:观察者模式广泛应用于各种领域,如用户界面的事件处理、多线程同步、消息队列等。例如,在GUI编程中,当用户点击按钮时,按钮对象作为主题,可以通知所有关联的观察者(如窗口、菜单等)进行相应...

Global site tag (gtag.js) - Google Analytics