来自线程的Java填充变量

时间:2015-02-10 08:27:03

标签: java multithreading

是否有可能从多个线程填充List或任何其他数据?

我已经尝试过使用同步列表。

public class Main {
    public static ArrayList<String> list = 
         Collections.synchronizedList(new ArrayList<String>());
    public static void main(String[] args) {
        MyRunnable r = new MyRunnable();
        Thread t1 = new Thread(r);
        t1.start();
        for(String s : list)
             System.out.println(s);
    }
}
public class MyRunnable implements Runnable {
     @Override 
     public void run() { 
         Main.list.add("testing some code");
     } 
}

2 个答案:

答案 0 :(得分:3)

你有竞争条件。主程序在列表仍为空时打印列表。只有这样,线程才会工作并向其添加内容。

等待线程完成:

t1.join();
// now print

答案 1 :(得分:2)

在处理线程时,您需要使用java.util.concurrent包中的集合。它们比同步集合更受欢迎,因为它们提供了额外的原子方法,例如putIfAbsent用于映射。

但这只是理论,你能放一些代码吗?

更新: 您的问题来自在MyRunnable完成之前完成主线程。你需要添加

t1.join()

这将告诉您的Main类等待直到MyRunnable线程完成。