java的观察者模式(有点监听器的感觉),Thread和Runnable的区别

这里面有两个概念:

Obserable 为被观察的人,

Observer  为观察的人,当被观察的人做了特定的工作之后,观察者就激活了。


直接上代码:被观察者

package com.flyread.thread;

import java.util.Iterator;
import java.util.Observable;
import java.util.Queue;

/**
 * FlyLoggerThread
 * Created by sff on 2017/5/6.
 */
public class FlyLoggerThread<T extends Task> extends Observable implements Runnable {

    /** 任务队列 */
    private Queue<T> tasks;
    /** 是将线程挂起和激活用的 */
    private Object object;
    /** 判断线程是不是被锁住,用于jvm异常关闭 */
    private Boolean isLocked;

    private int times = 0;
    public void doBusiness(){
        //出现异常时,通知一个别的线程。
        if(true){
            super.setChanged();
        }
//        notifyObservers(this);
        notifyObservers();
    }

    public FlyLoggerThread(){
        super();
        object = 1;
        isLocked = false;
        //tasks初始化
    }

    @Override
    public void run(){
        // 如果是Socket线程
        /**
         * 开启线程
         */
        // 如果是File、Console线程则不需要在while死循环前写前续代码
        // 在这里到底是文件操作还是Socket的连接的前续工作不能写,所以这个不适合将SocketThread、FileThread、ConsoleThread整合。
        // 但是可以将FileThread、ConsoleThread整合起来,因为他们不需要前续操作。
       try{
//           while(true){
//               if(tasks.size() > 0){
//                   Iterator iterator = tasks.iterator();
//                   while(iterator.hasNext()){
//                       T t = (T) iterator.next();
//                       t.doTask();
//                       popTask();
//                   }
//               } else{
//
//               }
//           }
           times ++;
           System.out.println(times);
           Thread.sleep(1000);
           int b = Integer.parseInt("aa");
       } catch (Exception e) {
           // 被中断。应该停止
            e.printStackTrace();
            doBusiness();
        }
    }

    public void threadWait(){
        try{
            object.wait();
        } catch (InterruptedException e){

        }
    }

    public void threadNotify(){
        object.notify();
    }

    public void pushTask(T task){
        if(!isLocked){
            synchronized (tasks){
                tasks.add(task);
            }
        }
    }

    public void popTask(){
        synchronized (tasks){
            tasks.remove();
        }
    }
}


观察者:

package com.flyread.thread;

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

/**
 * FlyLoggerThreadListener
 * Created by sff on 2017/5/6.
 */
public class FlyLoggerThreadListener implements Observer {
    @Override
    public void update(Observable o, Object arg) {
//        Object b = arg;
        FlyLoggerThread thread = (FlyLoggerThread) o;
        System.out.println("RunThread死机");
        //从线程池中判断是哪个有问题
        new Thread(thread).start();
        System.out.println("RunThread重启");
    }

}


运行代码:

package com.flyread.thread;

/**
 * 测试Observable
 * Created by sff on 2017/5/6.
 */
public class ListenerTest {
    public static void main(String[] args){
        FlyLoggerThread<Task> t = new FlyLoggerThread<>();
        FlyLoggerThreadListener listener = new FlyLoggerThreadListener();
        t.addObserver(listener);
        new Thread(t).start();
    }
}


运行结果:



参考:

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

Runnable和Thread的区别。

Runnable是一个接口,只有一个run方法。而Thread是一个类,它实现了Runnable。Thread.run()方法不会开一个子线程的,Thread.start()才会开一个子线程。Runnable.run()也不会开一个子线程的,new Thread(Runnable).start() 才会开一个子线程。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值