私は処理したいオブジェクトを持つLinkedListを持っています。オブジェクトは別のスレッドから追加されますが、1つのスレッドだけがそれを削除/読み込みします。私はキューにオブジェクトを追加し、別のスレッドでスレッドセーフティの問題
private LinkedList<MyObject> queue = new LinkedList<>();
new Thread()
{
@Override
public void run()
{
while (!Thread.interrupted())
{
if (!queue.isEmpty())
{
MyObject first = queue.removeFirst();
// do sth..
}
}
}
}.start();
queue.add(new MyObject());
時には、このコードは、私は本当に自分自身に説明カントた、しかし例外につながります。 java.util.LinkedList.removeFirst(LinkedList.java:270)私はこの例外を取得する理由はそれだけで削除しようとする必要があるため、取得いけない
でjava.util.NoSuchElementException 「」スレッドで 例外存在する場合はオブジェクト。
キューが空の場合、消費者スレッドは「ビジー待機」を行います。おそらくそれも修正するべきです。 –
少し愚かですが、これらのことは予測が非常に難しいことがあるので、実際にremoveFirstメソッドを呼び出すスレッドは1つだけであることを余儀なくされることをお勧めします。 if文の中にスレッドIDのプリントを追加します。 – TheFooBarWay
@ TheFooBarWay消費者が1人か2人かは関係ありません。同期の問題を引き起こすのに十分な複数のプロデューサが存在します。オブジェクトを変更するスレッドが複数ある場合は、同期させる必要があります。正確に1つのスレッドの変更と複数のスレッドの読み取りがあった場合は、非同期になる可能性があります(反復は難しいかもしれません)。 –