本帖最后由 tlcd 于 2009-08-18 01:42:33 编辑

解决方案 »

  1.   

    很粗略的想法:我写了个简单类:public class MyTimer {

    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成员)
      

  2.   

    如果楼主说不用循环的话
    意思就是Arraylist中的对象自行检测到期时间,并执行删除动作
    那末这样一来,每个对象都会变成一个线程,估计不会比楼主用循环快多少要实现的话
    就是用Timer类的schedule(TimerTask task, long delay) 方法
    但是要给一个TimerTask 类的对象为参数TimerTask 类是一个实现了Runnable接口的抽象类
    所以必须重写run方法,把要执行的任务写到run方法里面
    也就是楼主的删除任务
    然后把时间传给long delay参数,表示迟延多长时间执行那这样一来的话,删除每一个元素都变成了一项任务,也就是一个线程
    考虑效率,和楼主用循环不相上下吧
      

  3.   

    恩,使用Timer类.我还没有用过这个类,但它应该符合要求了,实际就是到时间就运行某些代码..这样应该符合要求了
      

  4.   

    用javax.swing.Timer类,分别为ArrayList的每个元素生成一个Timer。如果新添加、修改成员,则重置并启动该元素的Timer,等时间超过该Timer的时间延迟就会触发ActionEvent,只要把删除ArrayList元素的动作写进ActionListener中即可。下面是我实现的代码import java.util.*;
    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());
    }
    }
      

  5.   

    楼主说了,时间的精确度要求到毫秒级,那么如果用TimerTask的话,势必也要将周期设置成1ms。
    那样的话,跟楼主说的循环的方法,没什么区别吧?lovecj6185说的,每个元素都是一个独立的线程,我一开始也是这么想的。(因为只有这样,才能摆脱从外部轮询内部元素状态。也就是说,不用再以1ms为周期循环检验ArrayList中元素的状态了。)
    元素的状态改变的时候,它应该发送一个自定义的消息通知某个控制器,控制器监听到这个消息后,移除失效的元素。
    即便是这样,也不太可能精确到毫秒级。
      

  6.   

    谢谢大家的讨论。我觉得也是的,如果用timer的方式,每一个元素的带一个timer,那运行之中,同时系统中可能会启动太多的线程了,比如几千个。那这种线程间的切换就要占用很长时间,也就没法很精确了。所以想问问是不是java还有什么不知道的,可以有效率地用事件驱动执行一定任务的操作。看来只是除了循环,就是timer了。
      

  7.   

    为什么不去notify呢
    时间发生的时候,去notify关注的listener,这样才实时啊.sleep(1)就不能算实时了吧,还要加循环损耗
      

  8.   

    用循环的话,就是一个单独的线程里面运行的循环,也没有谁需要notify的。你说的是谁notify谁那?每一个元素只是一个数据对象,它也没法去notify别人?
      

  9.   

    还有一个问题
    楼主想要进行实时的监控那个Arraylist在线程里,线程的执行与否取决于CPU
    如果你那个用于监控的线程没有在被cpu执行,那末即使你Arraylist里的元素到期,那也没有办法虽说,现在的cpu频率都很快了,但是楼主如果想以毫秒为单位的话,还是不能完全实时的再假设,把每个对象都看作一个线程,用timer类来计时
    你那末多的对象,势必只能有一个对象的线程被cpu处理
    其他的,即便到时该删除了,也得等着
    呵呵,从这个角度上讲,毫秒级的实时比较难吧
    秒单位的话可能还可以突然想起来的,大家继续讨论
      

  10.   

    问一下LZ,列表中的成员的时间是不是固定不变?如果是固定不变的话,可以对list按时间进行一下排序,把时间最小的放在最前面,只要对第一个进行监控。如果时间是变化的话,先找出时间最小的A和第二小的B,每次对列表中的时间进行修改时,把修改的时间和A进行比较,如果修改的是A,把A和B进行比较。
      

  11.   

    每个列表成员的过期时间是固定的,但列表是一直变化,一些新的成员被加进来,而一些成员逐渐过期被删除。我现在大致想了这样做——————此外,还有一个线程专门对列表作添加操作,加入新成员——————那我就在这个线程对列表作添加操作时,同时创建一个timer,它就记着自己这个成员过期时删掉,然后就结束了。开始不想这样做的原因是,这样创建的timer明显是比做添加操作线程的级别低一级,所以优先级也低.所以系统应该会延迟的很厉害(只有处理完高优先级的线程后才会处理低的),所以到毫秒级的更新操作误差可能会非常大,远远实现不了。但看来没更好的办法,只有先这样实现下,然后测测看看了。