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 - Fatal编程技术网

Java线程将数据输出到集合获得错误结果

Java线程将数据输出到集合获得错误结果,java,multithreading,Java,Multithreading,我编写了一个测试java线程的小程序。 问题是我无法得到我预测的结果:每次100条记录。 我得到了随机数目的记录。在我删除这行的注释之后: //System.out.println(name+“Completed.”) 我每次都有100张唱片。 换句话说,我添加了一个System.out.println(),一切都很完美。 这是java的bug还是我没有注意到的东西 MyThread.java public class MyThread extends Thread { @Override

我编写了一个测试java线程的小程序。 问题是我无法得到我预测的结果:每次100条记录。 我得到了随机数目的记录。在我删除这行的注释之后:

//System.out.println(name+“Completed.”)

我每次都有100张唱片。 换句话说,我添加了一个System.out.println(),一切都很完美。 这是java的bug还是我没有注意到的东西

MyThread.java

public class MyThread extends Thread {

  @Override
  public void run() {

    String name = Thread.currentThread().getName();

    for (int i = 1; i <= 10; i++) {
      if (i == 10) {
        //System.out.println(name + " Completed.");
        TestThread.al.add(name);
      }
    }

  }

}
import java.util.ArrayList;

public class TestThread {

  public static ArrayList<String> al = new ArrayList<String>();

  public static void main(String[] args) throws Exception {

    ArrayList<MyThread> mt = new ArrayList<MyThread>();

    //set
    for (int i = 0; i < 100; i++) {
      mt.add(new MyThread());
      mt.get(i).setName("Worker " + (i + 1));
    }

    //start
    for (int i = 0; i < 100; i++) {
      mt.get(i).start();
    }

    //end
    for (int i = 0; i < 100; i++) {
        mt.get(i).join();
    }

    //result
    for (int i = 0; i < al.size(); i++) {
      System.out.println("Rank " + (i+1) + " : " + al.get(i));
    }

  }

}
公共类MyThread扩展线程{
@凌驾
公开募捐{
字符串名称=Thread.currentThread().getName();

对于(int i=1;iArrayList不是线程安全的
,可能存在这样一种情况:两个
线程
将数据写入ArrayList的相同
位置
,您可以使用Vector,因为它是线程安全的。


有关
线程安全的更多信息,请参见ArrayList不是
线程安全的
,可能存在这样一种情况:两个
线程将数据写入ArrayList的相同
位置
,您可以使用Vector,因为它是线程安全的。


有关线程安全的更多信息,请访问

cainiaofei已经回答了这个问题,但想补充几点:

您的
ArrayList
对象
al
正在引起问题,因为它被多个线程同时访问(读/写)

您需要了解以下基本要点:

每当多个线程同时访问一个对象时,请确保您需要使用线程安全类,如
Collections.synchronizedList()
(首选)或
Vector


如果您需要原语类型的线程安全,可以使用JDK的原子包,您可以查看它。

cainiaofei已经回答了这个问题,但还想补充几点:

您的
ArrayList
对象
al
正在引起问题,因为它被多个线程同时访问(读/写)

您需要了解以下基本要点:

每当多个线程同时访问一个对象时,请确保您需要使用线程安全类,如
Collections.synchronizedList()
(首选)或
Vector


如果您需要原语类型的线程安全,可以使用JDK的原子包,您可以查看。

我得到了所有100条记录,有注释行和没有注释行,唯一的区别是取消注释行时顺序是随机的。使用Vector后,我得到了100条记录和随机顺序,有或没有行。然后ead测试成功。:)我得到了所有100条记录,有注释行和没有注释行,唯一的区别是取消注释行时顺序是随机的。使用Vector后,我得到了100条记录和随机顺序,有或没有注释行。然后线程测试成功。:)谢谢。使用Vector后,我每次得到100条记录。谢谢。使用Vector后,我得到了10条记录每次0条记录。谢谢。现在我了解更多有关同步方法的信息。谢谢。现在我了解更多有关同步方法的信息。