2

我正在尝试在列表中添加一些项目并保持添加顺序。问题是添加部分是在一个线程中完成的,因为我需要从数据库中获取一些详细信息,将它们放在一个
项目中并将其添加到列表中。

public void addNewItem(Step item){

    Thread t = new Thread(new Runnable(){
        public void run() {
            item.setDetails(db.getStepDetails(step.getId()));
            add(item);
        }
    });

    t.start();
}

add方法如下所示:

private void add(Step step){
    mitems.add(step);
}

如果我做类似的事情

 addNewItem(stepA);
 addNewItem(stepB);

如果第一次调用花费太多时间,第二项将首先添加到我的列表中。

您知道如何在继续在我的列表中添加任何其他项目之前等待操作完成吗?

谢谢你。

4

6 回答 6

0

线程#join

等待这个线程死掉。

希望这会有所帮助,亚龙

于 2013-04-11T14:18:42.763 回答
0

您可以改用字典:

Dictionary mitems = new Hashtable();

mitems.put("1", item);

那时的关键就是秩序。

于 2013-04-11T12:56:25.487 回答
0

您可以添加同步块或使用 ReentrantLock。

Thread t = new Thread(new Runnable(){
    public void run() {
        synchronized(someSafeVar) {
            item.setDetails(db.getStepDetails(step.getId()));
            add(item);
        }
    }
});

此外,如果只是“添加”方法需要时间,则只能同步该方法。

于 2013-04-11T12:47:45.307 回答
0

如果您在设置详细信息之前将项目添加到列表中,则可以保留项目顺序。然后您可以等待所有以下操作,直到设置项目的初始化标志:

mitems.add(stepA);
mitems.add(stepB)

[...]

ThreadGroup group = new ThreadGroup("GetStepDetailsGroup");

for(Step step : mitems)
{
    Thread thread = new Thread(group, new Runnable(){
        public void run() {
            item.setDetails(db.getStepDetails(step.getId()));
        }
    });

    thread.start();
}

while(group.activeCount() > 0) {
    try {
        Thread.sleep(50);
    } catch(InteruptedExpection e) {
        // ignored
    }
}
于 2013-04-11T12:48:04.003 回答
0

您可以创建一个工作线程,并从队列中提供它,因此您将有一个添加到 mitems 的线程。

在这种情况下,您需要创建两个列表,并同步它们。

例如。,

List<Step> processingList = new ArrayList<Step>();
List<Step> mitems = new ArrayList<Step>();
public void addNewItem(Step item)
{
  syncrhonized(processingList)
  {
    processingList.add(item);
  }
}

工作线程从 processingList 的前面获取项目,对它们进行处理,并在它们准备好时将它们添加到 mitem。

于 2013-04-11T12:51:44.903 回答
0

在您的示例中,看起来将步骤添加到列表完全独立于从数据库中检索信息并填写步骤。

因此,您可以只使用一个线程将所有步骤放在一个列表中。然后,您将使用 Runnables 获取 DB 信息,每个 Step 一个,并在 Executor 中使用任意数量的线程执行这些 Runnables(同时仍然从多线程中获得加速)。

于 2013-04-11T13:27:46.083 回答