- 浏览: 318398 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
libaogui777:
前辈,您好, 使用PDFbox 提取内容遇到一个问题,想请教您 ...
java进行pdf解析-----pdfbox -
xin_hany:
提示惊醒了一下,解决了一个让人惆怅的问题,
danga的MemcachedClient的几个缺陷 -
roroyangivan:
牛B啊。。。我觉得 这种 回答。。。阿里的的CTO 都 HOL ...
怎样才是一个好的架构? -
406657836:
今天知道了一个线程创建时会给stack分配1M内存?一个线程默 ...
jvm线程的stack -
linzx0212:
受教了……
danga的MemcachedClient的几个缺陷
今天发现一个问题,不解.
TaskStatistic类源码
/**
*
*/
package cn.tohot.webdown.statistic;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import org.apache.log4j.Logger;
import cn.tohot.webdown.persist.StatisticDAO;
import cn.tohot.webdown.persist.TaskCountRecord;
import cn.tohot.webdown.util.Config;
/**
* 任务状态定时统计线程,只记录发生了变动的统计结果.<br>
* 以单例模式运行,通过观察者模式发送统计结果<br>
* 典型的观察者有客户端通讯和统计曲线图
*
* @author 杨
*
*/
public class TaskStatistic extends CommonStatisticSource {
static private int statisticRate = Config.getApplicationConfig().statisticRate();
static private TaskStatistic thread = null;
private static Logger log = Logger.getLogger(TaskStatistic.class);
private final ScheduledExecutorService schedule = Executors.newSingleThreadScheduledExecutor();
private boolean started = false;
private TaskStatistic() {
}
public static TaskStatistic getSingleScheduledThread() {
if (thread == null) {
thread = new TaskStatistic();
}
return thread;
}
/**
* 在垃圾收集前停止线程
* @see java.lang.Object#finalize()
*/
protected void finalize() throws Throwable {
this.stop();
super.finalize();
}
/**
* 启动,以固定的延迟频率统计数据库中任务的状态,如果状态发生变化则通知监听者,并记录.
*/
public void start() {
if (started)
return;
if (log.isInfoEnabled())
log.info("启动任务统计线程");
started = true;
final StatisticDAO dao = new StatisticDAO();
schedule.scheduleWithFixedDelay(
new Runnable() {
TaskCountRecord lastRecord = null;
public void run() {
TaskCountRecord totalCount = dao.countTaskStatus();
// 任务数没有变化则不更新
if (!totalCount.equals(lastRecord)) {
lastRecord = totalCount;
tellAllObservers(totalCount);
dao.save(totalCount);
}
notifyAll(totalCount);
}
},
statisticRate,
statisticRate,
TimeUnit.SECONDS
);
}
/**
* 结束
*/
public void stop() {
schedule.shutdown();
started = false;
if (log.isInfoEnabled())
log.info("停止任务统计线程");
}
}
CommonStatisticSource
/**
*
*/
package cn.tohot.webdown.statistic;
import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.Logger;
/**
* 简单统计消息源
*
* @author 杨
*
*/
public class CommonStatisticSource implements StatisticSource {
private static Logger log = Logger.getLogger(CommonStatisticSource.class);
final protected List<StatisticObserver> observers = new ArrayList<StatisticObserver>();
/**
* 把消息通知所有观察者
* @param message
*/
final protected void tellAllObservers(Object message) {
for (StatisticObserver obs : observers) {
if (obs != null) {
try {
obs.tellMe(message);
} catch (Exception e) {
log.error("监听器更新出错", e);
}
}
}
}
public void notifyAll(Object me){
//do
}
/*
* (non-Javadoc)
*
* @see
* cn.tohot.webdown.statistic.StatisticMessageSource#addObserver(cn.tohot
* .webdown.statistic.StatisticObserverIface)
*/
public void addObserver(StatisticObserver observer) {
observers.add(observer);
if(log.isDebugEnabled()) log.debug("增加一个观察者");
}
/*
* (non-Javadoc)
*
* @see
* cn.tohot.webdown.statistic.StatisticMessageSource#removeObserver(cn.tohot
* .webdown.statistic.StatisticObserverIface)
*/
public void removeObserver(StatisticObserver observer) {
observers.remove(observer);
if(log.isDebugEnabled()) log.debug("删除一个观察者");
}
}
后来我把notifyAll改成了tellAllObsever,发现是可以调用的. 但为什么notifyAll就不行呢? 这个Object的final方法有什么特殊约束吗? 经过一段时间思考, 应该是混淆了inner class的notifyAll()和outer class的notifyAll(), 可以把代码"notifyAll(totalCount); "改写成 " TaskStatistic.this.notifyAll(totalCount); ". 用明确的this引用来声明方法所属对象 ,果然不再报错了!
发表评论
-
Ruby API代码技巧
2012-05-23 21:53 1093http://www.slideshare.net/ihowe ... -
怎样才是一个好的架构?
2012-05-18 17:37 3673关于软件设计的抽象思想 曾经被阿里的某CTO问过一个问题 ... -
nginx的编译选项
2012-04-25 17:30 1509下载nginx源码包,编译命令之一: ./co ... -
10 Core Architecture Pattern Variations for Achieving Scalability
2011-11-20 22:00 1030【转载】:http://highscalability.com ... -
wowza doc of multi-bitrate streaming
2011-11-06 11:49 2339http://www.wowza.com/forums/con ... -
今天回首
2011-09-01 22:13 1256突然发觉很久不上javaeye了,仿佛生活中遗忘了这一块。 每 ... -
你的邮件”被垃圾“了吗?
2010-11-30 20:37 1108最近在注册系统中使用邮件激活,用公司的邮箱服务器发送帐号激活邮 ... -
mongodb的map/reduce实属鸡肋
2010-11-24 22:47 1497曾经被mongodb的特性所吸引,没想到map/reduce却 ... -
[老博迁移2005-11-09]TeracMiracle反编译成功
2010-08-12 22:13 860TeracMiracle反编译成功 TM:中国人写 ... -
[老博迁移2005-11-09] 越是官大,越是懒
2010-08-12 22:11 1119越是官大,越是懒 小小的公司里就有官僚了,真 ... -
danga的MemcachedClient的几个缺陷
2010-08-11 16:19 17384最近实际用起来我发现,java版danga的memcached ... -
今天参加RubyConfChina的活动,见识了
2010-06-27 00:27 1187这次是RubyConfChina的 ... -
该死的CXF
2010-04-15 21:20 1155为了连https web services,初步选择以前用得还 ... -
jsp太大编译不了,原来是64k的方法限制
2010-02-11 12:04 2772昨天遇到一个诡异的问题,吓出一身冷汗。 20几个300k ... -
javascript技巧:(function(){})()
2010-02-11 12:03 1180javascript技巧:(function(){})() ... -
lucene搜索引擎简单应用
2010-02-11 12:02 1211还用lucene架了个搜索引擎,对pdf进行全文搜索(联合 ... -
java进行pdf解析-----pdfbox
2010-02-11 11:58 10450对pdf解析有不少成熟技术,经过选型,我最后选定用pdfb ... -
用flash动态上传文件
2010-02-11 11:52 1161用flash写了一个动态的文件上传功能,当然也用了jque ... -
不当家不知道柴米贵,不开发不知道重启费
2010-02-11 11:21 1139话说我开始逐渐脱离群众,开发得越来越少。还好最近做了 ... -
【转】Getting real
2010-02-11 11:18 895【转】Getting real 刚才偶然看到的, ...
相关推荐
1、面向对象的特征有哪些方面? 2、访问修饰符public,private,protected,以及不写(默认)时的区别...24、静态嵌套类(Static Nested Class)和内部类(Inner Class)的不同? 25、Java 中会存在内存泄漏吗,请简单描述。
37.classloader中,JDK的API、Classpath中的同web-inf中的class加载方式有什么区别? 38.列举三种以上垃圾回收算法,并比较其优缺点? 39.编写代码实现一个线程池 40.描述一下JVM加载class文件的原理机制? 41....
第10章 内隐类(inner class) 146 10.1 静态类(static class) 146 10.2 成员类(member class) 147 10.3 局部类(local class) 150 10.4 匿名类(anonymous class) 152 10.5 巩固练习 153 第11章 异常处理...
【基础】静态嵌套类(Static Nested Class)和内部类(Inner Class)的不同? 19 【基础】关于“==”和“equal()” 19 关于“==” 19 关于“equals()” 20 【基础】String为什么是final 20 【基础】java中String、...
为了正确处理所有权转移问题,create_a()将用来适配返回值策略. 参见 策略 章节. -Linker Lin 4/5/08 6:32 PM struct B: A {}; struct C: B {}; void g(A*); void g(B*); 执行以下 Lua 代码即结果: a1 = create...
7.5.5 重载容易引发误解的两个地方——返回类型和形参名 170 7.5.6 重载中的最难点——参数匹配原则 171 7.6 使用类的实例作为方法参数 172 7.6.1 超车方法:使用类实例做参数 172 7.6.2 调用这个方法 173 ...
7.5.5 重载容易引发误解的两个地方——返回类型和形参名 170 7.5.6 重载中的最难点——参数匹配原则 171 7.6 使用类的实例作为方法参数 172 7.6.1 超车方法:使用类实例做参数 172 7.6.2 调用这个方法 173 ...
21、Static Nested Class 和 Inner Class的不同。 Static Nested Class是被声明为静态(static)的内部类,它可以不依赖于外部类实例被实例化。而通常的内部类需要在外部类实例化后才能实例化。 22、JSP中动态...
24、Static Nested Class 和 Inner Class的不同。 Static Nested Class是被声明为静态(static)的内部类,它可以不依赖于外部类实例被实例化。而通常的内部类需要在外部类实例化后才能实例化。 25、JSP中动态...
31、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)? 21 33、数字转字符有多少种方式,分别是什么 22 34、Java创建对象有几种方式 22 35、写出验证...
localVSmember.java 局部变量与成员变量同名问题示例 onlyTest.java 对象传值示例 otherClass.java 从类的外部访问对象的成员 showInstVar.java 演示不同的对象拥有不同的成员变量 showMain.java 演示main方法...
Q0041 Java保留字 11个:byValue, cast, false, future, generic, inner, operator, outer, rest, true, var. Q0042 Java的值传递的规则? Java基本类型的都是值传递,对象使用的都是引用传递 Q0043 java相关概念 ...
–在外部类以外的地方使用内部类,内部类完整的类名应该OuterClass.InnerClass. –在外部类以外的地方使用非静态内部类创建对象的语法如下:OuterInstance.new InnerConstructor() –在外部类以外的地方使用...
RELOAD: 重载访问控制表,刷新日志等。 SHUTDOWN: 关闭MySQL服务。 数据库/数据表/数据列权限: Alter: 修改已存在的数据表(例如增加/删除列)和索引。 Create: 建立新的数据库或数据表。 Delete: 删除表的记录...
RELOAD: 重载访问控制表,刷新日志等。 SHUTDOWN: 关闭MySQL服务。 数据库/数据表/数据列权限: Alter: 修改已存在的数据表(例如增加/删除列)和索引。 Create: 建立新的数据库或数据表。 Delete: 删除表的记录。 ...