一道java编程题求大神指点
/*统计网站访问量,要求实现Count接口,hr方法多线程访问,要保证线程安全要求:1.实现功能2.线程安全3.注意性能*/interfaceCount{//每访问一次h...
/*
统计网站访问量,要求实现Count接口,hr方法多线程访问,要保证线程安全
要求:
1.实现功能
2.线程安全
3.注意性能
*/
interface Count {
//每访问一次hr方法+1
void hr();
//访问状态
DateState state();
}
class DateState {
//最近10秒钟平均访问量
public int last10Second;
//最近60秒钟平均访问量
public int last60Second;
//最近10分钟平均访问量
public int last10Minute;
//最近60分钟平均访问量
public int last60Minute;
//60分钟平均访问量集合
public List<Integer> last60SecondList;
}
不知道该如何统计最近时间段里的访问量,求大神指点!!!!! 展开
统计网站访问量,要求实现Count接口,hr方法多线程访问,要保证线程安全
要求:
1.实现功能
2.线程安全
3.注意性能
*/
interface Count {
//每访问一次hr方法+1
void hr();
//访问状态
DateState state();
}
class DateState {
//最近10秒钟平均访问量
public int last10Second;
//最近60秒钟平均访问量
public int last60Second;
//最近10分钟平均访问量
public int last10Minute;
//最近60分钟平均访问量
public int last60Minute;
//60分钟平均访问量集合
public List<Integer> last60SecondList;
}
不知道该如何统计最近时间段里的访问量,求大神指点!!!!! 展开
2个回答
2019-05-05
展开全部
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong;
public class AccessTask implements Count {
AtomicLong count = new AtomicLong(0);
CopyOnWriteArrayList<Long> list = new CopyOnWriteArrayList<>();
//hr接口多线程访问
@Override
public void hr() {
count.getAndAdd(1);
System.out.println(Thread.currentThread().getName() +" 访问次数:"+count);
list.add(System.currentTimeMillis());
}
@Override
public DateState state() {
DateState dateState = new DateState();
int num = 0;
long now = System.currentTimeMillis();
long s1 = TimeUnit.SECONDS.toMillis(10);
long s2 = TimeUnit.SECONDS.toMillis(60);
long m1 = TimeUnit.MINUTES.toMillis(10);
long m2 = TimeUnit.MINUTES.toMillis(60);
if (list.size()>0) {
for (int i = list.size()-1; i >-1 ; i--) {
long time = now - list.get(i);
num++;
if (time<s1) {
dateState.setLast10Second(num);
}
if (time < s2) {
dateState.setLast60Second(num);
}
if (time<m1) {
dateState.setLast10Minute(num);
}
if (time < m2) {
dateState.setLast60Minute(num);
} else {
break;
}
}
}
System.out.println(dateState);
return dateState;
}
}
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class TestCount {
public static void main(String[] args) {
AccessTask accessTask = new AccessTask();
ExecutorService pool = Executors.newFixedThreadPool(20);
for (int i = 0; i < 100; i++) {
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
pool.execute(new Runnable() {
@Override
public void run() {
accessTask.hr();
accessTask.state();
}
});
}
pool.shutdown();
}
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我可以帮你写,私聊我发给你吧
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询