2

リストにいくつかの項目を追加して、追加順序を維持しようとしています。問題は、DB から詳細を取得し、それらを
項目に入れてリストに追加する必要があるため、追加部分がスレッドで行われることです。

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);

最初の呼び出しに時間がかかりすぎる場合は、2 番目の項目がリストの最初に追加されます。

リストに他のアイテムを追加し続ける前に、アクションが終了するのを待つ方法を知っていますか?

ありがとうございました。

4

6 に答える 6

0

あなたの例では、ステップをリストに追加することは、DB から情報を取得してステップを入力することとは完全に独立しているように見えます。

したがって、1 つのスレッドのみを使用して、すべてのステップをリストに入れることができます。次に、ステップごとに 1 つずつ Runnables を使用して DB 情報をフェッチし、Executor でこれらの Runnables を必要な数のスレッドで実行します (マルチスレッド化による高速化は引き続き得られます)。

于 2013-04-11T13:27:46.083 に答える
0

単一のワーカー スレッドを作成し、それをキューからフィードすることができます。したがって、単一のスレッドが mitem に追加されます。

その場合、2 つのリストを作成し、それらを同期する必要があります。

例えば。、

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

スレッド#結合

このスレッドが終了するのを待ちます。

これが役に立てば幸いです、ヤロン

于 2013-04-11T14:18:42.763 に答える
0

代わりに Dictionary を使用できます。

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);
        }
    }
});

また、時間がかかるのが「add」メソッドだけだとすると、このメソッドしか同期できませんでした。

于 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 に答える