解决方案 »
- public abstract class A extends B implement C{} 帮忙解释下这句java代码!
- 用hql怎么写
- java异常问题不知道错在哪了?
- 请问这个程序是在实现什么?
- applet中可以用AWT中的menu吗?
- Google + Java = ?
- 求高手保存的在ULTRAEDIT中设置自己的IDE的.txt文档
- 有谁知道怎么用JCreator的帮助
- 求问如何用java建win7超级用户
- 本地链接远程数据库成功,外网连接远程数据库失败,咋回事啊,大神们
- java swing中JTable怎样添加按钮到单元格中?
- jAVA:怎么用用MBEAN抓WEBLOGIC的MEMORY使用量
private long timeLeft;
private Timer timer;
private List<成员> 成员List; private 成员 my成员; public void setTimeLeft(long timeLeft) {
this.timeLeft = timeLeft;
} public long getTimeLeft() {
return timeLeft;
} public void setTimer(Timer timer) {
this.timer = timer;
} public Timer getTimer() {
return timer;
} public void set成员List(List<成员> 成员List) {
this.成员List = 成员List;
成员List.add(this.my成员);
} public List<成员> get成员List() {
return 成员List;
}
}这样就可以把存放成员的ArrayList传给上面这个类:myTimer.set成员List(List<成员> 成员List)当时间一到就可以:this.成员List.remove(this.my成员)
意思就是Arraylist中的对象自行检测到期时间,并执行删除动作
那末这样一来,每个对象都会变成一个线程,估计不会比楼主用循环快多少要实现的话
就是用Timer类的schedule(TimerTask task, long delay) 方法
但是要给一个TimerTask 类的对象为参数TimerTask 类是一个实现了Runnable接口的抽象类
所以必须重写run方法,把要执行的任务写到run方法里面
也就是楼主的删除任务
然后把时间传给long delay参数,表示迟延多长时间执行那这样一来的话,删除每一个元素都变成了一项任务,也就是一个线程
考虑效率,和楼主用循环不相上下吧
import java.awt.event.*;
class AutoRemoveTest
{
public static void main(String[] args)
{
AutoRemove ar=new AutoRemove(100);
for(int i=0;i<5;i++)
ar.setList(i,i);
int i=0;
while(i<1000000000){
if(i==10000000)
ar.setList(6,21);
if(i==50000000)
ar.setList(4,44);
if(i==100000000)
ar.setList(7,55);
i++;
}
}
}
class AutoRemove
{
public static final int LIST_SIZE=10;//list的大小
private ArrayList<Integer> list=new ArrayList(LIST_SIZE);
private RemoveTimer[] timers=new RemoveTimer[LIST_SIZE];//为每个元素保存一个Timer
private int remainTime;//元素在list中保存的时间
public AutoRemove(int time){
this.remainTime=time;
for(int i=0;i<LIST_SIZE;i++)
this.list.add(i);
}
public void setList(int pos,int element){
list.set(pos,element);
timers[pos]=new RemoveTimer(pos);
}
private class RemoveTimer implements ActionListener
{
private int index;//timer为list中下标为index的元素计时
private javax.swing.Timer timer;
public RemoveTimer(int index){
this.index=index;
this.timer=new javax.swing.Timer(remainTime,this);
this.timer.start();
this.timer.setRepeats(false);//让timer只执行一次
}
public void actionPerformed(ActionEvent e){
Object o=list.get(index);//没有用remove,不然显示的数据会混乱
System.out.println("下标"+index+" "+o.toString());
}
}
}
那样的话,跟楼主说的循环的方法,没什么区别吧?lovecj6185说的,每个元素都是一个独立的线程,我一开始也是这么想的。(因为只有这样,才能摆脱从外部轮询内部元素状态。也就是说,不用再以1ms为周期循环检验ArrayList中元素的状态了。)
元素的状态改变的时候,它应该发送一个自定义的消息通知某个控制器,控制器监听到这个消息后,移除失效的元素。
即便是这样,也不太可能精确到毫秒级。
时间发生的时候,去notify关注的listener,这样才实时啊.sleep(1)就不能算实时了吧,还要加循环损耗
楼主想要进行实时的监控那个Arraylist在线程里,线程的执行与否取决于CPU
如果你那个用于监控的线程没有在被cpu执行,那末即使你Arraylist里的元素到期,那也没有办法虽说,现在的cpu频率都很快了,但是楼主如果想以毫秒为单位的话,还是不能完全实时的再假设,把每个对象都看作一个线程,用timer类来计时
你那末多的对象,势必只能有一个对象的线程被cpu处理
其他的,即便到时该删除了,也得等着
呵呵,从这个角度上讲,毫秒级的实时比较难吧
秒单位的话可能还可以突然想起来的,大家继续讨论