java - Java中的多线程

标签 java multithreading

我还有课。例如:

public class Data {
    private String name;

    public Data(String url) {
        // There is download something from the Internet and set field "name".
    }

    public String getName() {
        return name;
    }
}

在某些方法中,我需要初始化对象数据数组。

ArrayList<Data> list = new ArrayList<Data>;
for(int i=0; i<max; i++) {
    list.add(new Data("http://localhost/" + String.valueOf(i)));
}

但是太长了。我想这样做:

final ArrayList<Data> list = new ArrayList<Data>;
for(int i=0; i<max; i++) {
    final int tmp = i;
    new Thread() {

        public void run() {
            list.add(new Data("http://localhost/" + String.valueOf(tmp)));
        }   

    }.start();

}

但是主线程比其他线程结束得早,并且变量列表为空。我应该怎么办?请帮助:)

向上。从互联网上下载一些数据并不算太快,这就是我创建多个线程的原因。

最佳答案

您可以使用 java 并发包,用一个执行器来处理线程,而不是处理 Thread API 的低级细节(我不知道 ListArray 是什么,但如果它不是线程安全的,您将拥有解决方案的问题提出了一些其他答案:添加联接是不够的)。

例如,一个简化的示例是:

final ExecutorService executor = Executors.newFixedThreadPool(10);
final List<Future<Data>> list = new ArrayList<Future<Data>>(max);

for (int i = 0; i < max; i++) {
    final int tmp = i;
    Callable<Data> c = new Callable<Data>() {
        @Override
        public Data call() {
            return new Data("http://localhost/" + tmp);
        }
    };
    list.add(executor.submit(c));
}

executor.shutdown();

for (Future<Data> future : list) {
    Data data = future.get(); //will block until the page has been downloaded
    //use the data
}

理想情况下,您应该在 future.get() 周围添加一些错误处理,因为如果您的任务抛出异常,它会抛出 ExecutionException,我认为这可能会发生例如,如果页面不可用。

关于java - Java中的多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11828536/

相关文章:

java - 当使用 Smack 4.1.0 API 作为 Google 的 GCM CCS 的 XMPP 客户端时,SecurityMode.required 不工作

multithreading - Memcached get 和 put 方法是线程安全的吗

java - Thread[main,5,main] 和 Thread[Thread-77416,5,main] 有什么区别

java - 没有名为 EclipseLink_JPA 的 EntityManager 持久性提供程序

Java servlet 故意抛出 http 500 错误

java - 黑莓中的声音配置文件更改/音量更改监听器

java - Android View 或 Activity ?

ios - 我可以在 Swift 中使用 actor 始终在主线程上调用函数吗?

java - 如果只有一个writer线程并且没有对map进行结构修改,我们是否需要同步java HashMap gets

c# - 寻找一个好的练习来帮助我在多线程方面做得更好