我试图根据servlet请求中的数据创建多个输出文本数据文件。以我的servlet的约束条件是:具有多线程的Java Servlet
- 我的servlet等待足够的请求产生一个文件
- 否则一分钟后,它会超时并产生之前打一个阈值(在一个文件中,例如20名)文件
我写的代码是这样的:
doGet
不同步doGet
我在创建一个新的线程池(原因是调用的应用程序到我的servlet不会发送下一个请求,直到我的servlet返回响应 - 所以我验证请求并返回即时确认返回以获取新的请求)传过来的所有请求数据在一个新的线程池创建
- 调用同步函数来完成线程计算和文件
我使用wait(60000)
打印线程。问题在于,代码在一分钟内生成了具有正确阈值(名称)的文件,但在一分钟超时后,生成的文件(极少数)的容量超过了,例如,名称多于我在容量。
我认为它与唤醒时引起问题的线程有关?
我的代码是
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));
}
如果你有到这里,然后感谢您阅读我的问题,并在此先感谢,如果您有任何thougths它朝分辨率!
仅供参考 - Camel外壳是Java变量通用的命名约定。 – Robin
感谢提醒罗宾 – user2622263