程序是多线程的,处理订单。所有的订单order装在一个Vector中,叫做orderVector.
然后很多其他的线程在处理这个orderVector中的order,并给order设置状态、;当处理完后,order的状态是DONE;由于orderVector在不断的增加新的order,为了效率更高,我就想把Done的order转移到另一个Vector(DoneVector)中;由一个线程专门做这件事情。现在问题是,总有许多order转不过去,或是速度很慢。代码如下:
public synchronized void moveDoneOrders() {
for (int i = 0; i < orderVector.size(); i++) {
Order order = (Order) orderVector.get(i);
if (order.getStatus() == Order.DONE) {
DoneVector.add(order);
orderVector.remove(order);
}
}
}注:这个方法被另一个线程调用

解决方案 »

  1.   

    两种可能
    1:你用线程来做本来就是一个花费时间的事情,因为多数情况下这个vector里面可能根本就没有DONE的order,而vector太大了。你可以在done之后直接就放到另外一个Vector里面
    2:synchronized用法不可取
    你是要对orderVector做同步,为什么要放到方法上呢?这样相当于在整个类实例上同步了,存在很大的风险
      

  2.   

    去掉synchronized也不行。。
    我的Vector最多有40多个order,应该不算多啊。你说的直接放进去倒是可以的,我用一个线程做,就是为了每个线程都只做自己的事情。。
      

  3.   

    首先不是去掉Synchronized,而是针对orderVector进行同步
    其次,你的这个线程运行间隔多少?不要太大你的程序里面有一个bug
    synchronized(orderVector){
    ArrayList templist=new ArrayList();
    for (int i = 0; i < orderVector.size(); i++) {
    Order order = (Order) orderVector.get(i);
    if (order.getStatus() == Order.DONE) {
                                         templist.add(order); orderVector.remove(order);
    }
    }
    }
    syncrhonized(DoneVector){
    for(int i=0;i<templist.size();i++){
        DoneVector.add(templist.get(i));
    }
    }明白了吗?
      

  4.   

    sorry

    ArrayList templist=new ArrayList();
    放到上面去
      

  5.   

    谢谢fool_leave() ;有什么bug呢?就是要对两个Vector分别做同步吗?
      

  6.   

    注意你的for (int i = 0; i < orderVector.size(); i++) 语句
    你的for循环里面有删除动作,一般这样的循环要从高处向低处遍历,不然当你删除一个对象后,size会减少一个,原来i的位置变成了i+1的元素,可是这是要执行i++,这样就会漏掉元素。你可以将
    for (int i = 0; i < orderVector.size(); i++) 
    改写成
    for (int i = orderVector.size()-1;  i >=0; i--) 
    试试看就明白了
      

  7.   

    为什么要引入"中间变量"ArrayList templist, 直接转移不行吗?实验证明,还是不能解决问题,我每秒钟执行一次。
      

  8.   

    再次谢谢 fool_leave() ..