0

何らかの要因に基づいて、異なる時間に 2 つの異なるスレッドによってオブジェクトが追加および削除されるキューを実装する必要があります。私の問題は、キュー (キュー全体とそれが保持するデータ) が 200KB 以上のデータを取得してはならないという要件です。スレッドは 200 であり、より多くのデータをプッシュするためのスペースが使用可能になるまで待機する必要があります。プッシュされるオブジェクトのサイズは異なる場合があります。Java キューを作成できますが、キューのサイズは、使用されているメモリの合計ではなく、プッシュされたオブジェクトの合計を返します。私のキューが参照しているデータの。

プッシュされたオブジェクトを次のように考えます

    class A{
       int x;
       byte[] buf;//array size vary per object
    }
4

1 に答える 1

0

Java には、このためのすぐに使える機能はありません。(一部には、コレクションに追加されたオブジェクトが他の場所で参照されているかどうかを簡単に知る方法がないため、それらを追加すると追加のメモリが消費されるためです。)

あなたのユースケースでは、おそらくキューをサブクラス化するのが最善でしょう。スーパーをオーバーライドして、オブジェクトのサイズをカウンターに追加し (明らかに、この計算スレッドを安全にする必要があります)、スペースがない場合は例外 IllegalStateException をスローします。同様に、オーバーライドされた削除クラスの場合はカウンターを減らします。

カウンターに追加するスペースの量を決定する方法はさまざまです。Farlan はこれを使用することを提案しましたが、うまくいくようです。ただし、バイト配列を扱っていることを示唆しているため、追加するデータのサイズはすでにわかっている可能性があります。また、オーバーヘッドを考慮する必要があるかどうかも検討する必要があります。オブジェクトは、キュー自体の内部の参照と同様に、ある程度のスペースを必要とします。さらに、キュー オブジェクト。その正確な値を把握することはできますが、要件はメモリ不足を防ぐことだけであるように思われるため、一貫性がある限り、それらの大まかな見積もりを使用することもできます。

サブクラス化するキュー クラスの詳細は、スレッド間でどの程度の競合が発生すると考えられるかによって異なります。しかし、同期の問題を処理しているようです。

于 2013-05-30T17:09:27.550 に答える