我还有课。例如:
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/