程序是多线程的,处理订单。所有的订单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);
}
}
}注:这个方法被另一个线程调用
然后很多其他的线程在处理这个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:你用线程来做本来就是一个花费时间的事情,因为多数情况下这个vector里面可能根本就没有DONE的order,而vector太大了。你可以在done之后直接就放到另外一个Vector里面
2:synchronized用法不可取
你是要对orderVector做同步,为什么要放到方法上呢?这样相当于在整个类实例上同步了,存在很大的风险
我的Vector最多有40多个order,应该不算多啊。你说的直接放进去倒是可以的,我用一个线程做,就是为了每个线程都只做自己的事情。。
其次,你的这个线程运行间隔多少?不要太大你的程序里面有一个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));
}
}明白了吗?
把
ArrayList templist=new ArrayList();
放到上面去
你的for循环里面有删除动作,一般这样的循环要从高处向低处遍历,不然当你删除一个对象后,size会减少一个,原来i的位置变成了i+1的元素,可是这是要执行i++,这样就会漏掉元素。你可以将
for (int i = 0; i < orderVector.size(); i++)
改写成
for (int i = orderVector.size()-1; i >=0; i--)
试试看就明白了