1

たぶんこれは本当にばかげた質問ですが、私に聞いてください。特定の入力日に何かを実行するための多数の同時リクエストを受け取るユースケースがあります。同じ入力日に2つの同時リクエストを受信した場合、(正当な理由で)前のリクエストが完全に終了するまで、後続のリクエストを続行しないでください。これを実現するために標準のjava.util.concurrentコンポーネントを使用する最良の方法は何ですか?私の最初の考えは、ロックを販売し、それが使用中であり、後続の要求がawait()されることを示すためにコピーを保持するLockFactoryを使用することでした。ただし、これにはボイラープレートコードがたくさんあるようです-私を避けているもっと簡単なトリックはありますか?

前もって感謝します!

4

5 に答える 5

1

リクエストをキューに入れて、一度に1つずつ処理する必要があるように思えます。では、おそらくjava.util.concurrentのBlockingQueue?

于 2011-11-16T19:00:30.113 に答える
1

複数のスレッドでリクエストを実行するには、ThreadPoolExecutorを作成する必要があります。また、現在処理されている入力日付のリストが必要です。このリストには、同期アクセサーとputIfAbsentメソッドが必要です。タスクをキューに送信する前に、入力日が現在処理されていないことを確認してください。ここで処理されている場合は、このタスクをキューの最後に移動して、次のタスクを実行してみてください。タスクが完了したら、入力した日付をリストから削除します。

于 2011-11-16T19:05:43.040 に答える
1

スレッドが入力要求を受け取り、それらを見逃したり複製したりすることなく、ロックの問題を処理できるシステムをすでに持っていると思います。次に必要なのは、各スレッドが現在作業中のものの入力日付をどこかに記録することです。スレッドが入力リクエストを調べるとき、最初に日付をチェックし、その日付のリクエストが現在処理されているかどうかを確認し、処理されている場合は、そのリクエストをキューに残して次のリクエストを取得します。

テスト時に「現在作業中のエントリ」が更新されていないことを確認するには、ある程度のロックが必要になります。

于 2011-11-16T19:11:01.847 に答える
1

日付の時刻に個々のロックをハッシュできます。

private static final ConcurrentMap<Long,Lock> dateLock = new ConcurrentHashMap<Long,Lock>();

public static Lock getLock(Date date){
  Lock lock = dateLock.get(date.getTime());  
  if(lock == null){
    Lock lock = new ReentrantLock();  
    Lock temp =dateLock.putIfAbsent(lock); 
    lock = temp == null ? lock : temp;
  }
 return lock;
}

同じ日が必要で、必ずしもミリ秒単位の正確な日付である必要がない場合は、次のようなことができます。

private static final ConcurrentMap<String,Lock> dateLock = new ConcurrentHashMap<String,Lock>();

public static Lock getLock(Date date){ 
  String formattedDate = new SimpleDateFormat("MM\dd\yyyy").parse(date);
  Lock lock = dateLock.get(formattedDate);  
  if(lock == null){
    Lock lock = new ReentrantLock();  
    Lock temp =dateLock.putIfAbsent(lock); 
    lock = temp == null ? lock : temp;
  }
 return lock;
}

次に、日付で相互排除が必要なリクエスト

Date date = ...;

Lock lock = getLock(date);
lock.lock(); 

など

于 2011-11-16T19:13:44.880 に答える
0

あなたが探している簡単なトリックは、「順番に処理する」パターンのスレッドプールです。 これは、パターンとそれを実装するためのさまざまなソリューションを説明するスレッドです。

于 2011-11-17T10:45:57.800 に答える