Java线程将数据输出到集合获得错误结果
我编写了一个测试java线程的小程序。 问题是我无法得到我预测的结果:每次100条记录。 我得到了随机数目的记录。在我删除这行的注释之后: //System.out.println(name+“Completed.”) 我每次都有100张唱片。 换句话说,我添加了一个System.out.println(),一切都很完美。 这是java的bug还是我没有注意到的东西 MyThread.javaJava线程将数据输出到集合获得错误结果,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
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条记录。谢谢。现在我了解更多有关同步方法的信息。谢谢。现在我了解更多有关同步方法的信息。