【发布时间】:2020-03-05 10:38:49
【问题描述】:
我编写了以下程序,该程序将创建三个线程并启动它们。每个线程的任务是迭代字符串列表。这个列表是一个同步列表。当我运行程序时,我仍然看到线程输出不同步。即,在第一个线程遍历列表中的所有内容之前,第二个线程中断,第三个线程以此类推
import java.util.*;
public class Program implements Runnable{
List<String> stars = Collections.synchronizedList(new ArrayList<String>());
public static void main(String[] ars){
System.out.println(Thread.currentThread().getName());
Program p = new Program();
p.init();
}
public void init(){
stars.add("Tom Hanks");
stars.add("Bruce Lee");
stars.add("Matthew");
stars.add("fasbender");
stars.add("pitt");
Thread one = new Thread(this);
one.setName("First");
Thread two = new Thread(this);
two.setName("Two");
Thread three = new Thread(this);
three.setName("Three");
one.start();
two.start();
three.start();
}
public void run(){
for(int i=0;i<stars.size();i++){
System.out.println(stars.get(i)+" "+Thread.currentThread().getName());
}
}
}
我期望输出为: 主要的 汤姆汉克斯第一 李小龙第一 马修第一 法斯宾德第一 皮特第一 汤姆汉克斯第二 李小龙第二 马修第二 法斯宾德第二 皮特第二 汤姆汉克斯第三 李小龙第三 马修三 法斯宾德第三 三等奖
但是当我运行程序时,实际的输出是这样的:
main
Tom Hanks First
Bruce Lee First
Matthew First
fasbender First
pitt First
Tom Hanks Three
Tom Hanks Two
Bruce Lee Three
Bruce Lee Two
Matthew Three
Matthew Two
fasbender Three
fasbender Two
pitt Three
pitt Two
【问题讨论】:
-
对我来说看起来是正确的。为什么您希望第一个线程在第二个线程开始之前完全完成?
-
检查this的答案,也许它会为你清除它。