サーブレット リクエストに含まれるデータに基づいて、複数の出力テキスト データ ファイルを作成しようとしています。私のサーブレットに対する制約は次のとおりです。
- 私のサーブレットは、ファイルを生成する前に、しきい値 (たとえば、ファイル内の 20 個の名前) に達するのに十分な数の要求を待機します。
- そうしないと、1 分後にタイムアウトになり、ファイルが生成されます
私が書いたコードは次のようなものです:
doGet
同期されていませんその中で
doGet
、新しいスレッドプールを作成しています(サーブレットへの呼び出し元のアプリケーションは、サーブレットが応答を返すまで次の要求を送信しないため、要求を検証し、新しい要求を取得するために即時の確認応答を返します)すべてのリクエスト データを、新しいスレッド プールで作成されたスレッドに渡します
- 同期関数を呼び出して、スレッドのカウントとファイルの印刷を行う
を使用してwait(60000)
います。問題は、コードが 1 分以内に (名前の) 正しいしきい値を持つファイルを生成することですが、1 分のタイムアウトの後、生成されたファイル (ごく少数) が容量を超えていることです。容量。
ウェイクアップ時に問題を引き起こしているスレッドと関係があると思いますか?
私のコードは
if(!hashmap_dob.containsKey(key)){
request_count=0;
hashmap_count.put(key, Integer.toString(request_count));
sb1 = new StringBuilder();
sb2 = new StringBuilder();
sb3 = new StringBuilder();
hashmap_dob.put(key, sb1);
hashmap_firstname.put(key, sb2);
hashmap_surname.put(key, sb3);
}
if(hashmap_dob.containsKey(key)){
request_count = Integer.parseInt(hm_count.get(key));
request_count++;
hashmap_count.put(key, Integer.toString(request_count));
hashmap_filehasbeenprinted.put(key, Boolean.toString(fileHasBeenPrinted));
}
hashmap_dob.get(key).append(dateofbirth + "-");
hashmap_firstname.get(key).append(firstName + "-");
hashmap_surname.get(key).append(surname + "-");
if (hashmap_count.get(key).equals(capacity)){
request_count = 0;
dob = hashmap_dob.get(key).toString();
firstname = hashmap_firstname.get(key).toString();
surname = hashmap_surname.get(key).toString();
produceFile(required String parameters for file printing);
fileHasBeenPrinted = true;
sb1 = new StringBuilder();
sb2 = new StringBuilder();
sb3 = new StringBuilder();
hashmap_dob.put(key, sb1);
hashmap_firstname.put(key, sb2);
hashmap_surname.put(key, sb3);
hashmap_count.put(key, Integer.toString(request_count));
hashmap_filehasbeenprinted.put(key, Boolean.toString(fileHasBeenPrinted));
}
try{
wait(Long.parseLong(listenerWaitingTime));
}catch (InterruptedException ie){
System.out.println("Thread interrupted from wait");
}
if(hashmap_filehasbeenprinted.get(key).equals("false")){
dob = hashmap_dob.get(key).toString();
firstname = hashmap_firstname.get(key).toString();
surname = hm_surname.get(key).toString();
produceFile(required String parameters for file printing );
sb1 = new StringBuilder();
sb2 = new StringBuilder();
sb3 = new StringBuilder();
hashmap_dob.put(key, sb1);
hashmap_firstname.put(key, sb2);
hashmap_surname.put(key, sb3);
fileHasBeenPrinted= true;
request_count =0;
hashmap_filehasbeenprinted.put(key, Boolean.toString(fileHasBeenPrinted));
hashmap_count.put(key, Integer.toString(request_count));
}
ここまで来たら、私の質問を読んでくれてありがとう。解決に向けて何か考えがあれば、事前に感謝します!