我写的一个统计在线人数的类,请大家进来讨论一下效率(来者有分)
package com.hnedu.stat;
/**
* 计算在线人数,说明:
*
* 在访问页面放入:
* com.hnedu.stat.OnlineCounter.addUser(Object object)
* 一般用ip来作为object的传入值,当然,如果网站统计登陆在线人数,也可用用户名
* 来作为object传入值。
*
* 调用显示在线人数
* com.hnedu.stat.OnlineCounter.getOnlineCount() *
*
* com.hnedu.stat.OnlineCounter.getOnline()
* 返回一个List,里面以String[]形式存放传入的object值和最后访问页面时间。
* by crazyren 2003-08-05 email: c_crazyren@hotmail.com
*/
import java.util.List;
import java.util.ArrayList;
import javax.servlet.http.HttpSession;
public class OnlineCounter {
//创建实例标记
public static boolean instanceFlag = false;
private static List list = new ArrayList();
private OnlineCounter() {
}
public static void addUser(Object object) {
//判断是否计数标志
boolean bool = true;
//得到用户当前访问时间
String nowtime = com.hnedu.util.StringUtils.getTime("mm:ss");
//Str数组用来存放用户得ip和访问时间
String[] str = new String[2];
str[0] = object.toString();
str[1] = nowtime;
//temp数组用来临时存放从list里面取出的用户ip和访问时间
String[] temp = new String[2];
//循环list
for (int i = 0; i < list.size(); i++) {
temp = (String[])list.get(i);
//如果从list里面取出的用户ip和str里面存放的ip相同,则更新访问时间
if(temp[0].equals(str[0])) {
list.set(i,str);
bool = false;
return;
}
//如果用户超过6分钟没有访问,则认为不在线
if(subTime(nowtime,temp[1]) > 300) {
list.remove(i);
}
}
if(bool) {
//添加一个新的在线用户
list.add(str);
}
//释放资源
str = null;temp = null;
}
public static int getOnlineCount() {
//返回当前在线人数
return list.size();
}
public static List getOnline() {
return list;
}
public void finalize() {
instanceFlag = false;
}
/** 计算两个时间差,返回相差秒数 */
private static int subTime(String src,String des) {
int n = 0;
java.util.Calendar ca = java.util.Calendar.getInstance();
long time1 =
compareStringTime(src,des,"mm:ss");
ca.setTimeInMillis(time1);
n = (ca.get(java.util.Calendar.MINUTE)) * 60;
n = n + ca.get(java.util.Calendar.SECOND);
return n;
}
/**
* 比较两个字符串时间的大小
* @param t1 时间1
* @param t2 时间2
* @param parrten 时间格式 :yyyy-MM-dd
* @return 返回long =0相等,>0 t1>t2,<0 t1<t2
*/
private static long compareStringTime(String t1, String t2, String parrten) {
java.text.SimpleDateFormat formatter = new java.text.SimpleDateFormat(parrten);
java.text.ParsePosition pos = new java.text.ParsePosition(0);
java.text.ParsePosition pos1 = new java.text.ParsePosition(0);
java.util.Date dt1 = formatter.parse(t1, pos);
java.util.Date dt2 = formatter.parse(t2, pos1);
long l = dt1.getTime() - dt2.getTime();
return l;
}
public static void main(String[] args) {
}
}