在多线程练习demo时遇到报错“Exception in thread “main” java.util.concurrent.ExecutionException: java.util.NoSuchElementException”
错误位置图片:
![在这里插入图片描述](https://img-blog.csdnimg.cn/b88cb9f17d7a4d73b711528b6d101ae4.png)
报错信息:
![在这里插入图片描述](https://img-blog.csdnimg.cn/82855dfbc6a748ff8c12ec5912cf8630.png)
错误原因:
在这里错误的把list集合放入迭代器求最大值了,因为上边list使用了remove()方法 list集合已经空,导致报错。
正确代码
package demo.ProblemExercise;
import java.util.ArrayList;
import java.util.Collections;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class ChouJiangXiangCallable implements Callable<Integer> {
ArrayList<Integer> list;
public ChouJiangXiangCallable(ArrayList list) {
this.list = list;
}
@Override
public Integer call() throws Exception {
ArrayList box = new ArrayList<Integer>();
while (true) {
synchronized (ChouJiangXiangCallable.class) {
if (list.size() == 0) {
System.out.println(Thread.currentThread().getName() + "抽到了" + box);
break;
} else {
Collections.shuffle(list);
Integer pr = list.remove(0);
box.add(pr);
}
}
Thread.sleep(100);
}
if (box.size() == 0) {
return null;
} else {
Integer max = (Integer)Collections.max(box);
return max;
}
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
ArrayList list = new ArrayList<Integer>();
Collections.addAll(list, 20, 50, 60, 70, 200, 210, 300, 400, 500, 800);
ChouJiangXiangCallable c=new ChouJiangXiangCallable(list);
FutureTask<Integer> ft1=new FutureTask<Integer>(c);
FutureTask<Integer> ft2=new FutureTask<Integer>(c);
Thread t1 = new Thread(ft1,"抽奖箱1");
Thread t2 = new Thread(ft2,"抽奖箱1");
t1.start();
t2.start();
Integer integer1 = ft1.get();
Integer integer2 = ft2.get();
System.out.println("抽奖箱1MAX::"+integer1);
System.out.println("抽奖箱2MAX::"+integer2);
}
}