首先看代码:/**
* 这个对象存储了在线的终端的信息。这个对象是线程安全的 ,你可以在多线程中使用它。
* 向这个对象中添加或者是移除在线终端的信息,将会直接影响到数据库中存储的终端在线状态。当然,也会最终影响到作业监管平台上面的终端在线情况监控。<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 被回收了
哪位高手能给点解释?
解决方案 »
- 一个关于文件流的问题
- 小妹是初学java语言,想随机输出4Tdf这样的混合数,请各位高手指点!!!
- 十万火急!在线等待
- SWING 难题难了我很久,我一个画面有很多,JLabel,JButton,JTable,等组建,当他们重合的时候,我要怎么控制控制他们谁显示在最上层,
- 在哪里找JDK帮助文档啊?
- poi中怎么给Excel创建多个sheet?
- 请问java里怎么显示无边框的窗口(没有标题栏)
- JTable.getSelectionModel().addListSelectionListener
- 【求助】想把spring配置放在jar包外,main方法里该怎么读取写”
- 怎样查找classpath中所有符合条件的properties文件?在线等待!!!!!!
- JTable按某一列排序有问题,该怎么解决?
- 如何访问 default package
你确定是terminals这个对象为空?是不是和他在同一行的其他对象是null的