有一个代理类,当积累了一定的调用次数后,才执行一次调用。。。如果超时,也会调用一次
怎么写啊。。。求
在一个类里开线程啊,设计一个计数,到多少了开始跑线程..超时又是什么意思..
定时器里累加,记录上次调用的时间,遇到次数超过或者时间超过,就调用,并且重置次数和调用时间
写了一个动态代理,不知道是否是你想要的。有些细节没完全实现,只实现了个大概。
public interface Test {
public void run();
}
public class TestImpl implements Test {
@Override
public void run() {
System.out.println("run");
}
}
@SuppressWarnings("all")
public class MyInvocationHandler implements InvocationHandler {
private long settingTime;
private Test obj;
private int settingInvokeNum;
private int realInvokeNum;
public MyInvocationHandler(String time, final int settingInvokeNum, final Test obj) {
this.settingInvokeNum = settingInvokeNum;
this.settingTime = new Date(time).getTime();
this.obj = obj;
new Thread(){
private boolean loop = true;
@Override
public void run() {
while(loop){
if(new Date().getTime()>settingTime){
//在这里可以做自己附加的操作
obj.run();
//在这里可以做自己附加的操作
loop = false;
}else{
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}.start();
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = null;
if(method.getName().equals("run")){
realInvokeNum++;
if(realInvokeNum>=settingInvokeNum){
result = method.invoke(obj, args);
realInvokeNum=0;
}
}
return result;
}
}
public class MainTest {
public static void main(String[] args) {
Test t = new TestImpl();
Test proxy = (Test) Proxy.newProxyInstance(Test.class.getClassLoader(), t.getClass().getInterfaces(), new MyInvocationHandler("2017/4/29", 3, t));
for(int i = 0 ;i<12;i++){
proxy.run();
}
}
}
建立一个列表,记录任务,开一个线程,永不停止。1、执行时重置定时器,超时设置超时状态,然后就判断任务列表长度和超时时间,执行方法,清空任务列表
创建一个固定大小队列,队列满了说明执行次数到了。执行一次,并清空队列。再累计....执行。