您的位置:首页 > 编程语言 > Java开发

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

2017-05-06 17:08 579 查看
这里面有两个概念:

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() 才会开一个子线程。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: