- 浏览: 328290 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
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 1137http://www.slideshare.net/ihowe ... -
怎样才是一个好的架构?
2012-05-18 17:37 3800关于软件设计的抽象思想 曾经被阿里的某CTO问过一个问题 ... -
nginx的编译选项
2012-04-25 17:30 1599下载nginx源码包,编译命令之一: ./co ... -
10 Core Architecture Pattern Variations for Achieving Scalability
2011-11-20 22:00 1107【转载】:http://highscalability.com ... -
wowza doc of multi-bitrate streaming
2011-11-06 11:49 2411http://www.wowza.com/forums/con ... -
今天回首
2011-09-01 22:13 1315突然发觉很久不上javaeye了,仿佛生活中遗忘了这一块。 每 ... -
你的邮件”被垃圾“了吗?
2010-11-30 20:37 1150最近在注册系统中使用邮件激活,用公司的邮箱服务器发送帐号激活邮 ... -
mongodb的map/reduce实属鸡肋
2010-11-24 22:47 1551曾经被mongodb的特性所吸引,没想到map/reduce却 ... -
[老博迁移2005-11-09]TeracMiracle反编译成功
2010-08-12 22:13 906TeracMiracle反编译成功 TM:中国人写 ... -
[老博迁移2005-11-09] 越是官大,越是懒
2010-08-12 22:11 1208越是官大,越是懒 小小的公司里就有官僚了,真 ... -
danga的MemcachedClient的几个缺陷
2010-08-11 16:19 17443最近实际用起来我发现,java版danga的memcached ... -
今天参加RubyConfChina的活动,见识了
2010-06-27 00:27 1240这次是RubyConfChina的 ... -
该死的CXF
2010-04-15 21:20 1193为了连https web services,初步选择以前用得还 ... -
jsp太大编译不了,原来是64k的方法限制
2010-02-11 12:04 2896昨天遇到一个诡异的问题,吓出一身冷汗。 20几个300k ... -
javascript技巧:(function(){})()
2010-02-11 12:03 1235javascript技巧:(function(){})() ... -
lucene搜索引擎简单应用
2010-02-11 12:02 1287还用lucene架了个搜索引擎,对pdf进行全文搜索(联合 ... -
java进行pdf解析-----pdfbox
2010-02-11 11:58 10612对pdf解析有不少成熟技术,经过选型,我最后选定用pdfb ... -
用flash动态上传文件
2010-02-11 11:52 1207用flash写了一个动态的文件上传功能,当然也用了jque ... -
不当家不知道柴米贵,不开发不知道重启费
2010-02-11 11:21 1180话说我开始逐渐脱离群众,开发得越来越少。还好最近做了 ... -
【转】Getting real
2010-02-11 11:18 932【转】Getting real 刚才偶然看到的, ...
相关推荐
Java 易混淆概念 Anonymous Inner Class Java编程语言中存在一些易混淆的概念,今天我们将探讨 Anonymous Inner Class、final、finally、finalize 的区别,Static Nested Class 和 Inner Class 的不同,&和&&的区别...
在Java中,还有Static Nested Class和Inner Class的概念。Static Nested Class意味着创建一个static内部类的对象,不需要一个外部类对象,不能从一个static内部类的一个对象访问一个外部类对象。 在Java面试中,还...
Inner Class 是一个内部类,需要外部类对象来访问,而 Static Nested Class 不需要外部类对象。Inner Class 可以访问外部类对象的成员变量,而 Static Nested Class 不能。 4. &和&&的区别 & 是位运算符,用于...
* 静态内部类(InnerClass)意味着:1、创建一个static内部类的对象,不需要一个外部类对象;2、不能从一个static内部类的一个对象访问一个外部类对象。 四、&和&&的区别 * &是位运算符,用于对二进制数进行位操作...
* Nested Class 是 C++ 的概念,Java 中称为 Inner Class。 * Java 内部类与 C++ 嵌套类最大的不同在于是否有指向外部的引用上。 * 静态内部类(Inner Class)意味着创建一个 static 内部类的对象,不需要一个外部类...
* Nested Class(一般是 C++的说法),Inner Class (一般是 JAVA 的说法)。 * Java 内部类与 C++嵌套类最大的不同就在于是否有指向外部的引用上。 * 静态内部类(Inner Class)意味着 1. 创建一个 static 内部类的...
答:内部类是定义在另一个类中的类,Static Nested Class是静态内部类,Inner Class是非静态内部类。 25.内部类可以引用它的包含类的成员吗?有没有什么限制? 答:内部类可以引用它的包含类的成员,但需要使用外部...
【Static Nested Class与Inner Class】 静态嵌套类(Static Nested Class)类似于普通的类,可以有自己的静态成员,而内部类(Inner Class)需要依赖外部类的实例,不能有静态成员。 【HashMap与Hashtable】 ...
2. **方法的重载与重写**: - **重载**:发生在同一个类中,方法名相同但参数列表不同(参数个数、类型或顺序不同)。返回值类型的变化不影响方法重载。 - **重写**:发生在父类与子类之间,子类的方法与父类同名...
**Static Nested Class 和 Inner Class**:Static Nested Class是静态嵌套类,可以直接通过类名创建实例,不依赖外部类实例。Inner Class是内部类,需要先创建外部类实例才能创建内部类实例。 **接口和抽象类的继承...
- Static Nested Class可以独立于外部类实例存在,而Inner Class需要外部类实例才能创建。 - Static Nested Class不能直接访问外部类的非静态成员,而Inner Class可以直接访问。 4. **& 和 &&的区别**: - `&`是...
以上内容涉及Java基础知识,包括类的访问控制、内部类、集合框架、基本数据类型、方法的重载与重写、断言的使用、字符串和数组的操作等,是Java程序员在面试中经常遇到的问题,对理解Java语言特性与编程实践有着重要...
3. **Static Nested Class与Inner Class**: - Static Nested Class(静态嵌套类)与普通类类似,只是与外部类有静态关联,可以直接访问外部类的静态成员,不包含对外部类实例的隐式引用。 - Inner Class(内部类...
根据给定的C++在线测试样本,...这些问题涵盖了C++中的多个关键概念,包括类成员访问、常量与预处理器、运算符重载、封装、指针操作以及模板和输入流处理。理解并掌握这些概念对于成为一名熟练的C++程序员至关重要。
3. Static Nested Class 和 Inner Class 的不同: * Static Nested Class 是将内部类声明为 static 的,意味着它可以独立于外围类对象存在。 * Inner Class 是一个非静态的内部类,隐式地保存了一个引用,指向创建...
3. **Static Nested Class 和 Inner Class**:静态内部类(Static Nested Class)可以在没有外部类实例的情况下创建,它可以访问外部类的静态成员,而不能访问非静态成员。非静态内部类(Inner Class)需要一个外部...
Static Nested Class 和 Inner Class 的不同:Nested Class 一般是 C++ 的说法,Inner Class 是 Java 的说法。Static Nested Class 是可以独立存在的类,而 Inner Class 不能独立存在,必须在外部类的实例中存在。
Static Nested Class 和 Inner Class 的不同在于,Nested Class(一般是 C++的说法),Inner Class(一般是 JAVA 的说法)。Java 内部类与 C++嵌套类最大的不同就在于是否有指向外部的引用上。具体来说,静态内部类...