在循环上使用Thread时发生异常

时间:2019-06-03 17:50:54

标签: java

运行主类时出现异常:exception on Thread's

i使用run方法,它看起来像这样:

    @Override
public synchronized void run() {
    // TODO Auto-generated method stub
    int randomNum = ThreadLocalRandom.current().nextInt(1, 4);
    Student studentThread = new Student();
    Inlay inlayThread = new Inlay();
    studentThread.setId(counter);
    inlayThread.setInlayId(randomNum);
    Course courseThread = new Course();
    courseThread.setInlayD(inlayThread);
    courseThread.setStudentD(studentThread);
    this.arrCourse.add(courseThread);
    System.out.println(courseThread.toString());
    counter++;
}

和我的Main:

    Course c = new Course();
    for(int i = 0 ; i<200;i++)
    {
        Thread t = new Thread(c);
        t.start();
    }
    c.toString();

这是什么例外?

谢谢!

2 个答案:

答案 0 :(得分:0)

您正在尝试使用不同的线程同时将项目添加到ArrayList中。您将必须使用并发数据结构(或使用不同的列表,它们将它们合并在一起)。

您可以在此处找到有关并发列表的更多信息:Is there a concurrent List in Java's JDK?

答案 1 :(得分:0)

您尝试将项目添加到(我认为)不是线程安全的常见实现ArrayListList,导致修改后抛出ConcurrentModificationException(添加/删除) )未经过优化的结构。

我建议使用Collections.synchronizedList包装器:

  

返回由指定列表支持的同步(线程安全)列表。为了保证串行访问,至关重要的是,对后备列表的所有访问都必须通过返回的列表来完成。

List<Course> arrCourse = Collections.synchronizedList(new ArrayList<>());