- 浏览: 495560 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
来这里学java:
...
实战篇:设计自己的Annotation -
yushui2000:
突然想到一种方法,就是1、2、2、3、4、5作为5个球(类似彩 ...
一道算法题目,值得一看 -
wst0350:
理解力
实战篇:设计自己的Annotation -
yingzhor:
楼下的,你看看代码不就知道怎么验证了吗?这不是放在sessio ...
利用servlet生成简单的验证码 -
ming_7755:
妙用Commons良药<三>
在现在的项目中,后台有一块程序感觉用Observer/Observable模式比较好一些,所以和同事就写这样一个很简单的demo出来,记录下来,当作记录吧。里面的用到的API是Doug Lea这一大牛写的concurrent包,已经成为了java1.5的标准库了。但我们只能1.4的JDK,所以用concurrent包来代替实现同样的功能。
有一个Pojo类如下:
再写一个在通知观察者之前需要做什么工作的类:
然后后,想想啊,就是写一个观察者嘛:
再就是,写一个最核心的Observable类啦,如下:
最后,就是再随便添加一个执行的类,如下:
执行的结果:
有一个Pojo类如下:
public class Account { private int numOne; private int numTwo; private int sum; public int getNumOne() { return numOne; } public void setNumOne(int numOne) { this.numOne = numOne; } public int getNumTwo() { return numTwo; } public void setNumTwo(int numTwo) { this.numTwo = numTwo; } public int getSum() { return sum; } public void setSum(int sum) { this.sum = sum; } }
再写一个在通知观察者之前需要做什么工作的类:
import edu.emory.mathcs.backport.java.util.concurrent.Callable; public class AccountTask implements Callable { private int numOne,numTwo; public AccountTask(int numOne , int numTwo){ this.numOne = numOne; this.numTwo = numTwo; } /** * 计算numOne和numTwo的值并相加 */ public Object call() throws Exception { int resultNum = this.numOne + this.numTwo; return String.valueOf(resultNum); } }
然后后,想想啊,就是写一个观察者嘛:
import java.util.Observable; import java.util.Observer; public class PaddingDBObserver implements Observer { /** 假设的数据保存 */ private int [][] db = new int [10][10]; public void update(Observable o, Object arg) { if (arg instanceof Account) { Account obj = (Account)arg; int rowNum = obj.getNumOne(); int colNum = obj.getNumTwo(); db[rowNum][colNum] = obj.getSum(); //假设数据保存的,在这一个例子里面并没有什么用 System.out.println("填充[" + rowNum + "][" + colNum +"]=" + obj.getSum()); } } }
再就是,写一个最核心的Observable类啦,如下:
import java.util.Observable; import edu.emory.mathcs.backport.java.util.concurrent.ExecutionException; import edu.emory.mathcs.backport.java.util.concurrent.ExecutorService; import edu.emory.mathcs.backport.java.util.concurrent.Executors; import edu.emory.mathcs.backport.java.util.concurrent.Future; public class ServiceThread extends Observable implements Runnable{ private static final long serialVersionUID = 7010111816402017124L; private volatile int numOne; private volatile int numTwo; public ServiceThread(int numOne, int numTwo) { this.numOne = numOne; this.numTwo = numTwo; } /** * 线程运行 */ public void run() { /** 创建一个使用单个 worker 线程的 Executor,以无界队列方式来运行该线程。 */ ExecutorService executor = Executors.newSingleThreadExecutor(); /** 提交一个返回值的任务用于执行,返回一个表示任务的未决结果的 Future */ Future future = executor.submit(new AccountTask(numOne, numTwo)); try { String result = (String) future.get(); int sum = Integer.parseInt(result); Account obj = new Account(); obj.setNumOne(this.numOne); obj.setNumTwo(this.numTwo); obj.setSum(sum); setChanged(); super.notifyObservers(obj); } catch (InterruptedException e) { } catch (ExecutionException e) { } /** 线程关闭 */ executor.shutdown(); } }
最后,就是再随便添加一个执行的类,如下:
import edu.emory.mathcs.backport.java.util.concurrent.ExecutorService; import edu.emory.mathcs.backport.java.util.concurrent.Executors; public class AccountMain { /** 线程池 */ private ExecutorService pool = null; public void start() { /** 创建一个可重用固定线程集合的线程池,以共享的无界队列方式来运行这些线程。 */ pool = Executors.newFixedThreadPool(10); for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { ServiceThread st = new ServiceThread(i, j); st.addObserver(new PaddingDBObserver()); pool.execute(st); } } /** 关闭线程池 */ pool.shutdown(); } /** * 测试程序 * @param args */ public static void main(String[] args) { AccountMain am = new AccountMain(); am.start(); } }
执行的结果:
引用
填充[0][2]=2
填充[0][9]=9
填充[0][5]=5
填充[0][1]=1
.........
填充[1][8]=9
填充[1][7]=8
.......
填充[2][8]=10
填充[3][2]=5
填充[3][3]=6
..........
填充[0][9]=9
填充[0][5]=5
填充[0][1]=1
.........
填充[1][8]=9
填充[1][7]=8
.......
填充[2][8]=10
填充[3][2]=5
填充[3][3]=6
..........
发表评论
-
读源码之旅 有意思的Integer类
2010-02-01 09:33 2133Integer类里面有如下一段 ... -
读源码之旅 java.io包
2010-01-28 16:11 2274对于下图,研究了一下常用的InputStream,ByteAr ... -
从自身体会谈一谈测试
2008-01-21 13:05 1947论坛上关于测试的帖子 ... -
The Contract for Equality[java]
2008-01-14 20:43 1514As we Know,The Java API documen ... -
来改善你的switch语句
2007-12-26 13:10 2776善用多态来改善你的switch语句 下面举的 ... -
java动态代理笔录
2007-12-22 15:14 2383大家都清楚Spring的AOP方面工作是很优秀,但是其内 ... -
url传递中文参数笔录
2007-12-21 19:35 4224url传递中文参数笔录 ... -
小心给servlet忽悠了
2007-12-05 18:53 2259你真的会写线程安全的s ... -
ThreadLocal浅解
2007-12-01 13:16 2224如果有看到spring的一些源码的同学都知道,Threa ... -
Java 5.0多线程编程学习资料笔录
2007-11-23 13:33 3800对于Java 5.0多线程编程的学习,可以参考一下网上的下面的 ... -
关于ClassLoader工作机制小记
2007-11-06 23:06 2271类装载器就是寻找类或接口字节文件进行解析并构造JVM内部对象表 ... -
web应用程序开发须注意私自启动线程的问题
2007-11-04 01:25 3165web应用程序开发注意私自启动线程的问题 我们知道静态变量是 ... -
interrupt方法点滴记录
2007-10-25 21:02 27631、sleep方法与interrupt方法 假如线程A像下 ... -
wait方法是在什么时候结束
2007-10-23 11:07 2870wait方法是在什么时候结束 1、当notify方法执行时 ... -
synchronized 笔记
2007-10-18 11:04 2857synchronized 笔记 1、synchronized ... -
该用notify 方法还是notifyAll方法
2007-10-18 10:15 2243选择notify的话,因为要唤醒的线程比较少,程序处理速度当然 ... -
有趣而简单的两段代码
2007-09-04 20:40 2164假如你想写一个小程序,保证字符串首尾两个字符是一样的,你可以如 ... -
正则表达式[浅例学习]
2007-07-17 16:19 2070举下面一段代码: public\\s+void\\s+test ... -
熟悉一下几个常用的eclipse快捷键
2007-07-16 13:03 1844在论坛里看到一个帖子,是Godlikeme在这一个帖子写的 h ... -
线程间通信一小例学习
2007-06-16 13:41 3394wait:告诉线程放弃监视器并进入睡眠状态,直到其他线程进入同 ...
相关推荐
Observer与Command模式在VTK类库设计中的应用研究 通过阅读本文档可以熟悉vtk中的重要编程模式
从Observer到Observable:使用Functional Swift提升复杂iOS项目的可维护性
从Observer到Observable:使用Functional Swift提升复杂iOS项目的可维护性.pdf
这是最简单的一个MVC实例,通过它你可以了解MVC的基本工作原理。
观察者模式介绍:Observable和Observer原理分析,手动实现简单MyObservable和MyObserver
// Create an `Observable` from a single item and subscribe to the observer. sub := observable.Just(1).Subscribe(watcher) fmt.Println(score) // 20 } 标签:RxGo
observer观察者模式
pattern/src/behavior/observer //13.3观察者模式 pattern/src/behavior/iterator //13.4迭代子模式 pattern/src/behavior/chainofresponsibility//13.5责任链模式 pattern/src/behavior/command //13.6命令模式 ...
C#面向对象设计模式纵横谈(19):(行为型模式) Observer 观察者模式 (Level 300)
上课的实践设计模式 本示例使用MVC(模型视图控制器)和Observer / Observable模式
Observer设计模式是一种经典的设计模式,在GOF 23种设计模式种 比较常用于实际。主要是有类指针传递并引用方法和消息传递响应的方法来实现。
C#面向对象设计模式 (行为型模式) Observer 观察者模式 视频讲座下载
Java内置的Observable类和Observer接口提供了基本的观察者模式功能,你可以通过继承Observable类和实现Observer接口来使用
观察者模式 概述 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 适用性 1.当一个抽象模型有两个方面,其中一个方面依赖于另一方面。 将这二者封装...
Observer观察者模式:以汽车与驾使员为例
模式记忆Android Studio 项目; 简单的“西蒙”(电子游戏)克隆。 在 4 个彩色键上重现图案。 没有声音。 可在 Android API 9 (2.3 Gingerbread) 及... Java Observer / Observable 向 ScoreBar 广播分数和回合变化。
前端项目-eventmaster,一种简单、紧凑和一致的实现,它同时提供promise/deferred/flow模式和event/notify/observer/pubsub模式。
NULL 博文链接:https://gary0416.iteye.com/blog/909427