Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 简单多线程程序崩溃?_Java_Multithreading_Runnable - Fatal编程技术网

Java 简单多线程程序崩溃?

Java 简单多线程程序崩溃?,java,multithreading,runnable,Java,Multithreading,Runnable,当我运行这个程序时,它崩溃了。看起来运行时出现了一些问题。我不明白怎么了?有人能解释一下吗 public static void main(String[] args) { final ArrayList<Object> holder = new ArrayList<>(); final Runnable runnable = new Runnable() { public void run() { for (int

当我运行这个程序时,它崩溃了。看起来运行时出现了一些问题。我不明白怎么了?有人能解释一下吗

public static void main(String[] args) {
    final ArrayList<Object> holder = new ArrayList<>();
    final Runnable runnable = new Runnable() {
        public void run() {
            for (int i = 1; i <= 1000000; i++) {
                holder.add(new Object());
            }

        }
    };

    new Thread(runnable).start();
    new Thread(runnable).start();
    new Thread(runnable).start();
}
Exception in thread "Thread-5" java.lang.ArrayIndexOutOfBoundsException: Array index out of range: 244

您有多个线程添加到ArrayList。但是,添加不是线程安全的操作

请注意,此实现是不同步的。如果多个线程同时访问ArrayList实例,并且至少有一个线程在结构上修改该列表,则必须在外部对其进行同步。(结构修改是添加或删除一个或多个元素,或显式调整支持数组大小的任何操作;仅设置元素的值不是结构修改。)


您有多个线程添加到ArrayList。但是,添加不是线程安全的操作

请注意,此实现是不同步的。如果多个线程同时访问ArrayList实例,并且至少有一个线程在结构上修改该列表,则必须在外部对其进行同步。(结构修改是添加或删除一个或多个元素,或显式调整支持数组大小的任何操作;仅设置元素的值不是结构修改。)


出现此错误是因为多个线程试图访问同一列表。例如,如果线程1访问列表索引20,而线程2同时访问列表索引20,则会导致问题。有一个简单的解决方案可以解决这个问题:

public static void main(String[] args) {
    final Runnable runnable = new Runnable() {
        public void run() {
        final ArrayList<Object> holder = new ArrayList<>();
            for (int i = 1; i <= 1000000; i++) {
                holder.add(new Object());
            }

        }
    };

    new Thread(runnable).start();
    new Thread(runnable).start();
    new Thread(runnable).start();
}
publicstaticvoidmain(字符串[]args){
final Runnable Runnable=新Runnable(){
公开募捐{
最终ArrayList持有者=新ArrayList();

对于(int i=1;i您会遇到此错误,因为多个线程试图访问同一列表。例如,如果线程1访问列表索引20,而线程2同时访问列表索引20,则会导致问题。有一个简单的解决方案可以解决此问题:

public static void main(String[] args) {
    final Runnable runnable = new Runnable() {
        public void run() {
        final ArrayList<Object> holder = new ArrayList<>();
            for (int i = 1; i <= 1000000; i++) {
                holder.add(new Object());
            }

        }
    };

    new Thread(runnable).start();
    new Thread(runnable).start();
    new Thread(runnable).start();
}
publicstaticvoidmain(字符串[]args){
final Runnable Runnable=新Runnable(){
公开募捐{
最终ArrayList持有者=新ArrayList();

对于(int i=1;i)您所说的“崩溃”是什么意思?您的输出中是否有一些异常?您的JVM是否与报告一起崩溃?或者它只是停止?是的,我刚刚添加了错误消息..忘记了先前添加。您所说的“崩溃”是什么意思?您的输出中是否存在一些异常?您的JVM是否因报告而崩溃?或者它只是停止了?是的,我刚刚添加了错误消息..忘记了早期添加。谢谢Eric,我还使用运行时收到的错误消息更新了我的问题。另外,我可以使用什么数据结构来代替ArrrayList?您可以使用synchronizedlist^^或用于其他options现在肯定有主意了。我的
ArrayIndexOutOfBoundsException
异常呢?为什么我会得到它,我如何修复它?因为
如果多个线程同时访问一个ArrayList实例,并且至少有一个线程在结构上修改列表,那么它必须在外部同步,每个线程都有自己的线程关于ArrayList当前大小的想法。一个线程认为“它足够大了”,另一个线程中断了它并更改了数组列表的内部状态,然后第一个线程恢复。请注意,对于任何给定的运行,您可能会或可能不会出现此错误。考虑到您的长循环和紧循环,您很可能会出现此错误。但它不可能总是在同一点上。谢谢Eric,我还用e更新了我的问题我在运行时收到错误消息。另外,我可以在这里使用什么数据结构来代替ArrayList?您可以使用synchronizedlist^^或其他选项。我的
ArrayIndexOutOfBoundsException
异常如何?我为什么会得到它,以及如何修复它?因为
如果多个线程访问ArrayList instanc同时,至少有一个线程在结构上修改列表,它必须在外部同步
,每个线程对ArrayList的当前大小都有自己的想法。一个线程认为“它足够大了”,另一个线程中断了它并更改了数组列表的内部状态,然后第一个线程恢复。请注意,对于任何给定的运行,您可能会或可能不会出现此错误。考虑到您的长循环和紧循环,您很可能会出现此错误。但它不可能总是在同一点上。是的,这样应该可以工作。您如何判断r如果OP没有告诉我们它应该做什么,它是否有效?嗯,如果多个线程试图访问同一个列表,那么为什么我们会出现异常,仍然无法理解。另外,如果我在ArrayList上使用了
集合。synchronizedList
,那么这个错误会自动消失,而不做任何其他更改?是的,这样它会自动消失可以。如果OP没有告诉我们它应该做什么,你怎么说它是否有效?嗯,如果几个线程试图访问同一个列表,那么为什么我们会出现异常,仍然无法理解。另外,如果我在ArrayList上使用
Collections.synchronizedList
,那么这个错误将自动消失,而不进行任何修改你还有别的零钱吗?