1

プロパティ type を持つ POJO を生成する Producer があります。「A」と「B」の2種類しかありません。コンシューマ用のスレッド プールがあります。プロデューサーからタイプ「B」のメッセージを受け取るたびに、実行に進む前に、プール内の他のすべてのスレッドが実行を完了していることを確認する必要があります (今のところデフォルトの Thread.sleep)。次に、コンシューマ スレッドはタイプ「B」のメッセージを取得して実行する必要があります。このスレッドが実行されるまで、キューからメッセージをポップすることはできません。

例:

class POJO_Message{

String type; //This will contain the type of message "A" or "B"

}
4

2 に答える 2

0

ReadWriteLockを使用して作業を行うことができます。メッセージ タイプが 'B' の場合、書き込みロックを取得してみてください。他のタイプのメッセージは読み取りロックを取得します。このような単純なコードを 1 つ実行します。

public class ConsumerProducerQueue {
    ExecutorService executor = Executors.newFixedThreadPool(10);
    private ReadWriteLock lock = new ReentrantReadWriteLock();

    public void addMessage(Message message) {
        if ("B".equals(message.getType())) {
            lock.writeLock().lock();
            Future<?> result = executor.submit(new Task(message));
            try {
                result.get();
            } catch (Exception e) {

            } finally {
                lock.writeLock().unlock();
            }
        } else {
            lock.readLock().lock();
            Future<?> result = executor.submit(new Task(message));
            try {
                result.get();
            } catch (Exception e) {

            } finally {
                lock.readLock().unlock();
            }
        }
    }
}

このメソッドのパフォーマンスは良くありません。

于 2019-03-28T12:18:30.260 に答える