我正在尝试编写一个多线程的 apache tomcat servlet,它将在它处理的每个 POST 正文中接收大量文本,并且在 GET 请求时,它将返回接收到的唯一单词的数量。我已经设法使用 Qt 和 QtWebApp 库完成了这项工作,但是我似乎无法在 Java 中完成这项工作。我不确定问题出在哪里,但可能与应用程序的整体线程安全有关(或者与单词的拆分和保存方式有关)。返回的字数总是太高(比实际数量高大约 2000-4000,即 70000 到 140000 - 我确实有这些测试用例的结果)。我的代码如下:
@WebServlet(name = "data", urlPatterns = {"/myserver/","/myserver/data","/myserver/count"})
public class data extends HttpServlet {
HashSet<String> slova = new HashSet<>();
public final Lock lock = new ReentrantLock();
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
try (PrintWriter out = response.getWriter()) {
if("POST".equals(request.getMethod()) && "/osp/myserver/data".equals(request.getRequestURI())){
InputStream body = request.getInputStream();
GZIPInputStream gstream = new GZIPInputStream(body);
BufferedReader buffreader = new BufferedReader(new InputStreamReader(gstream, "UTF8"));
String vse ="";
StringBuffer sbuffer = new StringBuffer();
while ((vse = buffreader.readLine()) != null)
{
sbuffer.append(vse);
}
String text = sbuffer.toString();
System.out.println(text);
String[] words = text.split("\\s+");
lock.lock();
for(int i = 0; i < words.length; i++){
slova.add(words[i]);
}
lock.unlock();
}
if("GET".equals(request.getMethod()) && "/osp/myserver/count".equals(request.getRequestURI())){
out.println(slova.size());
slova.clear();
}
}
}
知道是什么原因造成的吗?任何反馈将不胜感激。我可以根据要求发布可用的 Qt 源代码。
最佳答案
JB Nizet 提到的字符串拆分是问题的根源。
关于java - apache tomcat servlet 中 java HashSet 的线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36921791/