1

ユーザーのフォルダーから CSV ファイルを処理し、処理後にデータベースに保存する必要があるシナリオがあります。ユーザーごとに 5 種類のフィードがあります。すべてのユーザーは、そのフォルダー内の任意のフィードをいつでも送信できます。処理のためにいつでも送信できます。以下のルールに従う必要があります。

  • 同じクライアントの同じタイプのフィードを同時に処理することはできません。つまり、時間は同時に処理されないように常にブロックする必要があります。
  • 「x」を超えるクライアント間での同時処理を許可しない
  • 同じクライアントに対して "y" 個を超えるファイルの同時処理を許可しない

これを達成するための良い方法は何ですか?

4

1 に答える 1

0

最初の制限は、AtomicBooleanのマップで実装できます。初期化後にマップのキーを変更しないため、これはおそらく ConcurrentHashMap である必要はありません。完了したら、フィードの値を false にリセットすることを忘れないでください。

checkAndProcessFeed(Feed feed, Map<String, AtomicBoolean> map) {
    while(!map.get(feed.type).compareAndSet(false, true)) // assuming the AtomicBooleans were initialized to false
        Thread.sleep(500);
    }
    process(feed); // at this point map.get(feed.type).get() == true
    map.get(feed.type).set(false); // reset the AtomicBoolean to false
}

他の 2 つの制限は、クライアント数とクライアントごとのファイルを維持するために使用されるAtomicIntegerで実装できます。処理が完了するとデクリメントし、compare-and-set でインクリメントして新しいクライアント/ファイルを開始します。

final int maxClient = 5;
AtomicInteger clientCount = new AtomicInteger(0);
ConcurrentLinkedQueue<Client> queue = new ConcurrentLinkedQueue<>(); // hold waiting clients
while(true) {
    int temp = clientCount.intValue();
    if(!queue.isEmpty() && clientCount.compareAndSet(temp, temp + 1) { // thread-safe increment 
        process(clients.poll()); // don't forget to decrement the clientCount when the processing finishes
    } else Thread.sleep(500);
}
于 2013-04-19T16:39:03.723 に答える