具有多线程的 Java Servlet

标签 java multithreading servlets

我正在尝试根据 servlet 请求中存在的数据创建多个输出文本数据文件。我的 servlet 的限制是:

  • 我的 servlet 在生成文件之前等待足够多的请求达到阈值(例如文件中有 20 个名称)
  • 否则它会在一分钟后超时并生成一个文件

我写的代码是这样的:

  1. doGet不同步

  2. doGet 中,我正在创建一个新的线程池(原因是调用我的 servlet 的应用程序不会发送下一个请求,直到我的 servlet 返回响应 - 所以我验证请求并返回即时确认以获取新请求)

  3. 将所有请求数据传递给在新线程池中创建的线程

  4. 调用同步函数进行线程计数和文件打印

我正在使用 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));
            }

如果你到了这里,那么感谢你阅读我的问题,如果你对解决问题有任何想法,请提前致谢!

最佳答案

我没有看你的代码,但我发现你的方法很复杂。试试这个:

  1. 创建 BlockingQueue用于处理数据。
  2. 在servlet中,将数据放入队列并返回。
  3. 在启动时创建一个工作线程,它从队列中提取数据,超时为 60 秒,并将它们收集到一个列表中。
  4. 如果列表有足够的元素或发生超时,则写入一个新文件。

ServletContextListener 中创建线程和队列。中断线程以停止它。在线程中,当您在等待队列时收到 InterruptedException 时,将最后剩余的项目刷新到文件中。

关于具有多线程的 Java Servlet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17879938/

相关文章:

java - Spark 序列化策略 - 我应该只使用 Kryo 吗?

c++ - QueueUserAPC - 抛出异常崩溃,可能是 mingw 错误

java - 整数不会递增?

java - GlassFish(或任何 servlet 容器)上 HTTP 连接的 JCIFS NTLM 身份验证

java - Struts中如何找到文件的位置?

java - 使用 weka 和 python 加载分类器模型

java - Apache Camel Junit 保持 Context 运行

java - Xstream 在输出中插入奇怪的标签

java - JAVA中Synchronized和Final的关系

java - 从 Servlet 输出 SoyTemplates 的最佳方式