我正在尝试在列表中添加一些项目并保留添加顺序。问题是 添加部分是在一个线程中完成的,因为我需要从DB获取一些细节,将它们放在一个文件中 item并将其添加到列表中。
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);
如果第一个电话花费的时间过长,则会在我的列表中首先添加第二个项目。
在继续添加列表中的任何其他项目之前,您是否知道如何等待操作完成?
谢谢。
答案 0 :(得分:0)
您可以添加同步块或使用ReentrantLock。
Thread t = new Thread(new Runnable(){
public void run() {
synchronized(someSafeVar) {
item.setDetails(db.getStepDetails(step.getId()));
add(item);
}
}
});
此外,如果它只是需要时间的“添加”方法,则此方法只能同步。
答案 1 :(得分: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
}
}
答案 2 :(得分:0)
您可以创建一个工作线程,并从队列中提供它,因此您可以将一个线程添加到mitems。
在这种情况下,你需要创建两个列表,然后同步它们。
EG。,
List<Step> processingList = new ArrayList<Step>();
List<Step> mitems = new ArrayList<Step>();
public void addNewItem(Step item)
{
syncrhonized(processingList)
{
processingList.add(item);
}
}
工作线程从processingList的前面获取项目,对它们进行处理,并在它们准备就绪时将它们添加到mitems中。
答案 3 :(得分:0)
您可以改为使用词典:
Dictionary mitems = new Hashtable();
和
mitems.put("1", item);
Key将成为订单。
答案 4 :(得分:0)
在您的示例中,将步骤添加到列表看起来完全独立于从数据库中检索信息并填写步骤。
因此,您可以只使用一个Thread将所有步骤放入List中。然后,您将使用Runnables获取数据库信息,每个步骤一个,并在Executor中执行具有任意数量线程的Runnables(同时仍然从多线程获得加速)。
答案 5 :(得分:0)