1

私のアプリケーションでは、要素を追加する4PriorityBlockingQueueつのスレッドと、そこから要素をポーリングする1つのスレッドがあります。ポーリングスレッドの場合、キューにアクセスできないようです。スレッドセーフにするための対策を講じる必要があると思います。

最初の要素を取得した後、キューをクリアすると、他の4つの充填スレッドによって再び充填されるはずです。

ポーリングスレッドと入力スレッドは、を保持する同じクラス内にありますPriorityBlockingQueue

これがポーリングのコードです。

private class UPPainter implements Runnable {
    @Override
    public void run() {
        while(queue.size() > 0) {
            ReceivedMsg msg = queue.poll();
            queue.clear();
            for(final IPacketListener c : listeners) {
                new Thread(new ListenerUp(c, msg)).start();
            }
        }
    }
}
4

1 に答える 1

0

コンシューマスレッドが開始すると、キューが空になる可能性があるため、size = 0でrun()が終了します。メッセージが入力されるのを実際に待つ必要があります。また、キューをクリアすることは私には意味がないようですか?コンシューマースレッドを「閉じる」場合は、特別なキューの終わりメッセージを送信します。queue.take()を使用して、要素が挿入されるまで実際にブロックします。

private class UPPainter implements Runnable {  
    @Override  
    public void run() {  
        while(true) {  
            ReceivedMsg msg = queue.take();  
            for(final IPacketListener c : listeners) {  
                new Thread(new ListenerUp(c, msg)).start();  
            }  
        }  
    }  
}
于 2012-10-17T10:08:36.920 に答える