首先看代码:/**
* 这个对象存储了在线的终端的信息。这个对象是线程安全的 ,你可以在多线程中使用它。
* 向这个对象中添加或者是移除在线终端的信息,将会直接影响到数据库中存储的终端在线状态。当然,也会最终影响到作业监管平台上面的终端在线情况监控。<br>
* 需要注意的是:如果你要在循环的过程中调用这个对象的remove方法,那么调用之后应该立即退出循环,否则将会引发{@linkplain java.util.
* ConcurrentModificationException}。
* 引起这个异常的原因是由于集合内部的计数器不一致导致的,详细的关于这个问题的介绍请参见联机帮助。
*
* @author LuJun
* @version 2011-04-07
*/
public class ActiveTerminalPool {
private static final Map<String, TerminalInfo> terminals = new HashMap<String, TerminalInfo>(); private ActiveTerminalPool() {
} /**
* 向在线终端集合中添加一个终端信息
*
* @param info
*/
public static synchronized void add(TerminalInfo info) {
terminals.put(info.getTerminalId(), info);
} /**
* 通过终端编号获取一个在线的终端的信息,如果这个终端不在线,那么将会返回null
*
* @param terminalId
* - 终端的编号
*/
public static synchronized TerminalInfo get(String terminalId) {
return terminals.get(terminalId);
} /**
* 获得所有的在线的终端的信息
*
* @return
*/
public static synchronized Collection<TerminalInfo> getActiveTerminalInfos() {
return terminals.values();
} /**
* 从在线终端集合中移除一个终端信息
*
* @param terminalId
* - 要移除的终端的编号
*/
public static synchronized void remove(String terminalId) {
// // 使用Iterator对象可以避免java.util.ConcurrentModificationException
// for (Iterator<TerminalInfo> it = terminals.values().iterator(); it
// .hasNext();) {
// TerminalInfo info = it.next();
// if (info.getTerminalId().equals(terminalId)) {
// it.remove();
// break;
// }
// } terminals.remove(terminalId);
} /**
* 设置最后一次在线检测的时间
*
* @param terminalId
* - 要设置的终端的编号
* @param lastOnLineCheckTime
* - 要设置的最后一次检测的时间
*/
public static synchronized void setLastOnLineCheckTime(String terminalId,
long lastOnLineCheckTime) {
terminals.get(terminalId).setLastOnLineCheckTime(lastOnLineCheckTime);
} /**
* 获得最后一次在线检测的时间
*
* @param terminalId
* - 终端的编号
* @return 最后一次检测的时间
*/
public static synchronized long getLastOnLineCheckTime(String terminalId) {
return terminals.get(terminalId).getLastOnLineCheckTime();
}
}
terminals 对象应该是在类加载的时候就已经创建好了,但是我的应用程序仍然会在有的时候(并不频繁)报出terminals 对象为空的异常。感觉就像是terminals 被回收了
哪位高手能给点解释?
* 这个对象存储了在线的终端的信息。这个对象是线程安全的 ,你可以在多线程中使用它。
* 向这个对象中添加或者是移除在线终端的信息,将会直接影响到数据库中存储的终端在线状态。当然,也会最终影响到作业监管平台上面的终端在线情况监控。<br>
* 需要注意的是:如果你要在循环的过程中调用这个对象的remove方法,那么调用之后应该立即退出循环,否则将会引发{@linkplain java.util.
* ConcurrentModificationException}。
* 引起这个异常的原因是由于集合内部的计数器不一致导致的,详细的关于这个问题的介绍请参见联机帮助。
*
* @author LuJun
* @version 2011-04-07
*/
public class ActiveTerminalPool {
private static final Map<String, TerminalInfo> terminals = new HashMap<String, TerminalInfo>(); private ActiveTerminalPool() {
} /**
* 向在线终端集合中添加一个终端信息
*
* @param info
*/
public static synchronized void add(TerminalInfo info) {
terminals.put(info.getTerminalId(), info);
} /**
* 通过终端编号获取一个在线的终端的信息,如果这个终端不在线,那么将会返回null
*
* @param terminalId
* - 终端的编号
*/
public static synchronized TerminalInfo get(String terminalId) {
return terminals.get(terminalId);
} /**
* 获得所有的在线的终端的信息
*
* @return
*/
public static synchronized Collection<TerminalInfo> getActiveTerminalInfos() {
return terminals.values();
} /**
* 从在线终端集合中移除一个终端信息
*
* @param terminalId
* - 要移除的终端的编号
*/
public static synchronized void remove(String terminalId) {
// // 使用Iterator对象可以避免java.util.ConcurrentModificationException
// for (Iterator<TerminalInfo> it = terminals.values().iterator(); it
// .hasNext();) {
// TerminalInfo info = it.next();
// if (info.getTerminalId().equals(terminalId)) {
// it.remove();
// break;
// }
// } terminals.remove(terminalId);
} /**
* 设置最后一次在线检测的时间
*
* @param terminalId
* - 要设置的终端的编号
* @param lastOnLineCheckTime
* - 要设置的最后一次检测的时间
*/
public static synchronized void setLastOnLineCheckTime(String terminalId,
long lastOnLineCheckTime) {
terminals.get(terminalId).setLastOnLineCheckTime(lastOnLineCheckTime);
} /**
* 获得最后一次在线检测的时间
*
* @param terminalId
* - 终端的编号
* @return 最后一次检测的时间
*/
public static synchronized long getLastOnLineCheckTime(String terminalId) {
return terminals.get(terminalId).getLastOnLineCheckTime();
}
}
terminals 对象应该是在类加载的时候就已经创建好了,但是我的应用程序仍然会在有的时候(并不频繁)报出terminals 对象为空的异常。感觉就像是terminals 被回收了
哪位高手能给点解释?
解决方案 »
- 难道 我这样不能添加 滚动条吗
- 多个不同任务使用多线程如何限制总的线程数
- jsp,servlet,mysql中文问题最新实践.
- 请教一个正则式的问题
- 讨论一下 Java 中的数组和 Array 类的关系如何?
- 寻求linux下java和oracle开发相同爱好者,并留下QQ。以及解决一下我现有的几个问题
- java 编写的 access 数据库
- jbuilder7 + cvs时当place project into cvs时,好多包(目录)被自动删除了,请问有知道如何解决地吗?
- 关于死锁的一个程序,有几个地方不明白,请教一下
- 讨论关于打包的问题,有请javamap及各位对此熟悉的大虾或有困惑的菜鸟
- JTable按某一列排序有问题,该怎么解决?
- 如何访问 default package
你确定是terminals这个对象为空?是不是和他在同一行的其他对象是null的