我已經定義了返回一個列表一個ExecutorService爲List<Callable> callables=Collections.synchronizedList(new ArrayList<Callable>());
的ExecutorService和List <未來<Callable>>與ConcurrentModificationException的
我做了一個synchronizedList當我第一次過這個問題,因爲我認爲這將是線程安全的,但問題仍然存在。
我遇到的問題是,下面的代碼在低於Future<Object> next = i.next();
拋出ConcurrentModificationException的。值得注意的是,它在爆炸前部分通過列表。
ExecutorWorker snapshotExecutorWorker=new ExecutorWorker(this);
Iterator<Future<Object>> i= futures.iterator();
while(i.hasNext()){
Future<Object> next = i.next();//List<Callable>
try {
Object get = next.get();
Class<? extends Object> aClass = get.getClass();
System.out.println("Class= "+aClass);
List<Callable> l= (List)get;
System.out.println("L.size= "+l.size());
for(int a=0;a<l.size();a++){
snapshotExecutorWorker.addTask(l.get(a));
}
} catch (InterruptedException ex) {
Logger.getLogger(GUI.class.getName()).log(Level.SEVERE, null, ex);
} catch (ExecutionException ex) {
Logger.getLogger(GUI.class.getName()).log(Level.SEVERE, null, ex);
}
}
ExecutorWorker基本上是一個SwingWorker,用於監視ExecutorCompletionService的狀態。
public class ExecutorWorker extends SwingWorker<List<Future>, Object> implements ExecutorInterface {
List<Future> results = new ArrayList();
ExecutorService executorService = Executors.newFixedThreadPool(100);
ExecutorCompletionService<Object> ecs = new ExecutorCompletionService<>(executorService);
List<Future<Object>> jobs = new ArrayList();
ProgressMonitor progressMonitor;
boolean isExecuting = true;
Monitor monitor;
public ExecutorWorker(Monitor f) {
monitor = f;
}
public void addMonitor(Monitor f) {
monitor = f;
}
/**
*This method adds Callables to the Executor.
* @param r
* @return
*/
@Override
public Future<?> addTask(Callable r) {
Future futureValue = ecs.submit(r);
monitor.addFuture(futureValue);
System.out.println("Callable added in [ExecutorWorker]");
jobs.add(futureValue);
monitor.tasksAdded(true);
return futureValue;
}
/**
*This method returns a List containing the Future results. Use Future.get() to retrieve.
* @return
*/
public List<Future> getResults() {
return results;
}
@Override
protected void done() {
}
@Override
protected List<Future> doInBackground() throws ExecutionException, InterruptedException {
// System.out.println("Executor: In Do In BackGround");
// System.out.println("Jobs.size= " + jobs.size());
for (int i = 0; i < this.jobs.size(); i++) {
Future<Object> take = ecs.take();
results.add(take);
monitor.tasksCompleted(true);
int v = (int) ((monitor.getCompletedTasks()/ this.monitor.getTotalTasks()) * 100);
this.setProgress(v);
String message = String.format("Processing " + (i + 1) + " of " + jobs.size() + " Jobs. %d%%.\n", v);
System.out.println("Message= " + message);
progressMonitor.setNote(message);
}
return results;
}
public void setProgressMonitor(ProgressMonitor progressMonitor) {
this.progressMonitor = progressMonitor;
}
}
沒有時間進入它現在,但是你從哪裏獲得期貨收益?因爲你似乎正在改變那個集合,而你試圖迭代它,那麼...... welll ......你做不到。 – Mark
你的第一塊代碼似乎與你的第二塊代碼無關。我懷疑第一個塊可能是Monitor類的addFuture方法,但我不想根據這種猜測來回答。請顯示第一個代碼塊所屬的方法和類。 – VGR