-1
public void updatePrice(Price update){
   sendPriceUpdate(update); //takes a long time
}

sendPriceUpdate呼び出しがまだ実行されている間は待機し、保留中の更新をキューに入れることを除いて、上記を実行するクラスを構築したいと思います。呼び出しが戻ると、最後の更新が送信されます(そして他の更新は破棄されます)。つまり、送信呼び出しが戻るのを待ってから、保留中の最後の価格更新を送信します。

使用する適切なデータ構造は何ですか?

4

2 に答える 2

0

最善の解決策は、更新プログラムがこれを既に認識しており、「差分」データ、つまり変更されたデータまたは相違点のみを取得することです。これが不可能な場合は、最新の更新をロールバックするしかありません。このためには、以前の更新を保存して、元に戻して新しい更新をプッシュできるようにする必要があります。このようなものが動作するはずです:

public class Updater
{
    private static Price prevUpdate = null;

    public static synchronized void updatePrice(Price update)
    {
        if (prevUpdate != null)
        {
            rollbackUpdate(prevUpdate);
        }
        sendPriceUpdate(update); //takes a long time        
        prevUpdate = update;
    }
}

staticこのクラスのオブジェクトをインスタンス化する必要はないと思うので、これを に変更しました。私には静的サービスのように見えます。私が間違っている場合 (たとえば、異なるスレッドが異なるアップデータを使用したいため、異なる更新を追跡する場合)、変更してください。

これはスレッドセーフですが、sendPriceUpdate()時間がかかると、updatePrice()メソッドで多くのスレッドがロックされる可能性があります。また、これはスローされる例外を考慮していないため、これを考慮する必要があります。

私がコメントで言ったように、これは(非常に?)悪い解決策ですが、どれが最後か、または最後がいつ到着するかわからない場合は、これが唯一の解決策です。ソフトウェアの再設計により、この状況が解決されるか、より高いレベルで解決される可能性があります (を呼び出す前にupdatePrice()) 。

于 2012-06-19T09:08:59.597 に答える
0

Active-Object パターンを使用することをお勧めします。キュー (別名アクティベーション キューまたは操作キュー) をオブジェクトに関連付ける必要があります。最初に破棄せずに解決する方法を説明し、次に破棄をどのように処理する必要があると思うかを説明します。主な考え方は次のとおりです
。 A. オブジェクトはキューのフィールドを持ちます - キューのジェネリック型としましょう (PriceOperation のジェネリック引数を持つ)

B. PriceOperation はメソッド オブジェクトを保持します (java.lang.reflect.method) 、呼び出しのターゲット オブジェクト -let の PriceManager (updatePrice メソッドを持っている)、およびパラメーター (更新の場合は Price である必要があるとしましょう)

C. sendPriceUpdate は、"update" (Price にそのようなメソッドがあるとしましょう) のメソッド オブジェクト、または同期呼び出しの場合にアクティブ化したメソッドの PriceOperation のオブジェクトをキューに入れます

。 D. 関連付けられているスレッドオブジェクトはキューで待機し、キューが空でない場合、PriceOperation オブジェクトをデキューし、関連するパラメーター (Price オブジェクト) を使用してターゲット オブジェクト (PriceManager であるか他のオブジェクトであるかに関係なく) でメソッドを呼び出します。

E. このようにして、保留中の更新のキューを保持し、PriceManager と非同期で作業することができます

F. あなたが最後の更新を破棄することに関心があることに気付きました。この場合、キューではなくプライオリティ キューを使用し、プライオリティ ソートをタイムスタンプに基づいて、PriceOperation が最近作成されたものが処理されます。プロシージャー (PriceManager) とコンシューマー (スレッド) の間でこのキューを同期する必要があります。

于 2012-06-19T09:16:27.410 に答える