我在做一个采用优先权算法模拟处理机调度的实验。
自定义了一个PCB类存放进程的这些信息:
进程ID
优先权
CPU时间(要求运行时间)
状态(就绪、运行、终止)
然后用一个TreeSet类的treeset存放进程的队列。
Iterator iter = treeset.iterator();
while(iter.hasNext()){
PCB pcb = (PCB)iter.next();
if(pcb.time == 0){ 
pcb.state = "终止";
/*********加了下面这句就会报错**************/
//treeset.remove(pcb); //从就绪队列(已按优先权排序)中选一个进程运行
Iterator iterTemp = treeset.iterator();     
while(iterTemp.hasNext()){
PCB pcbTemp = (PCB)iterTemp.next();
if(pcbTemp.state == "就绪"){ 
pcbTemp.state = "运行"; 
break;
}
}
}
    
//进程运行:优先权-1,运行时间-1
if(pcb.state == "运行"){
pcb.weight--;
pcb.time--;
}}
为什么
/*********加了下面这句就会报错**************/
//treeset.remove(pcb);
报的是Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException

解决方案 »

  1.   

    有一个异常:报的是Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationExceptionapi文档说:if a thread modifies a collection directly while it is iterating over the collection with a fail-fast iterator, the iterator will throw this exception. 翻译: 如果一个线程直接修改一个真正被枚举(iterate)的fail-fast集合,这个异常就会被抛出所以, 这里是不能被remove的。 可以用其他数据结构实一下, 比如list. 或者新建一个treeset,导出非终止状态的pcb。或者保存这个pcb object的信息, iterate完了後再remove。