java中的多线程web应用程序

java中的多线程web应用程序,java,multithreading,jsp,Java,Multithreading,Jsp,我正在做一个web应用程序,它的前端是Java,后端是shell脚本。概念是我需要在后端处理多个文件。我将从用户那里获得日期范围(例如从7月1日到8日),每天处理大约100个文件。所以我总共有800个文件要处理 我将从JSP获取这些详细信息,并将后台调用委托给shell脚本,然后返回结果并将其显示给用户 现在我用一种顺序的方法完成了所有这些——我的意思是没有线程。因此,只有一个主线程执行,用户必须等待800个文件按顺序处理。然而,这真的很慢。正因为如此,我在考虑寻找线索。由于我是一名线程初学者,

我正在做一个web应用程序,它的前端是Java,后端是shell脚本。概念是我需要在后端处理多个文件。我将从用户那里获得日期范围(例如从7月1日到8日),每天处理大约100个文件。所以我总共有800个文件要处理

我将从JSP获取这些详细信息,并将后台调用委托给shell脚本,然后返回结果并将其显示给用户

现在我用一种顺序的方法完成了所有这些——我的意思是没有线程。因此,只有一个主线程执行,用户必须等待800个文件按顺序处理。然而,这真的很慢。正因为如此,我在考虑寻找线索。由于我是一名线程初学者,我阅读了一些关于这方面的资料,我提出了以下想法:

当我读到线程时,工作必须被拆分。。我想把这张桌子分开 8天工作到4个线程,其中每个线程将执行2天工作


我想知道我是否遵循了正确的方法,我主要关注的是:

  • 建议从web应用程序生成多个线程吗
  • 这是否是一个好方法

  • 关于如何进行此操作的一些指导。举个例子就好了。谢谢。

    是的,您可以在多线程或任何高性能环境中运行长处理作业。您还应该使用Servlet 3.0异步请求处理来挂起请求线程,并等待长时间的处理任务完成

  • 是的,从web应用程序生成多个线程没有什么错。事实上,如果您正在运行一个Servlet容器(很可能是因为您使用的是Java),那么它已经为您生成了多个线程。通常,Servlet容器会自动生成一个新线程(或从池中重用一个线程)来处理它收到的每个请求

  • 考虑到系统的硬件配置和web服务上的并发负载量,您的方法很好,但您需要将线程数量微调到合适的数量。还要注意的是,虽然旋转一组线程将减少处理所有数据所需的总时间,但在任何数据准备返回用户之前,它仍然会留下一大块潜在的时间。因此,您可以通过按顺序执行较小的工作单元,并在准备好后将每批结果发布到用户界面,从而获得更好的结果。然后,用户仍然需要很长时间才能获得所有数据,但这几乎可以立即开始查看其中的一部分


  • 在web应用程序中创建线程不是一个好的解决方案。这是一个糟糕的设计,因为通常由容器(web服务器)负责该活动。所以我认为你必须找到另一个解决办法


    我建议您将shell脚本放在cron中,计划每分钟运行一次,要“激活”它们,您可以触摸充当信号量的文件。在每次运行时,脚本都会验证web应用程序是否接触了信号量文件,如果是,则从这些文件中读取日期间隔,然后开始处理

    改善用户体验的方法不是在Servlet级别对100000个线程进行并行化,而是提供视图的增量呈现。首先,根据MVC模式将应用程序分为多个层是很有用的

    说到这里,你得看看怎么做

    • 创建一个能够返回部分答案和最后一个答案的服务,这意味着所有可用数据都已返回。每个答案都可以并行计算,以提高性能

    • 以增量方式填充网页,特别是通过调用此服务,该服务返回用于向DOM添加数据的JSON字符串。每次你得到一个答案,如果这是一个部分答案,你会再次呼叫提供先前序列号的服务

    如果你期待Liligo去理解,你会看到这是如何工作的。我描述的技术称为轮询,但还有其他技术可以在UI级别获得类似的异步结果。一般来说,您不希望直接使用ServletAPI,这是一个非常低级的API,而是使用一个合理的框架或抽象

    如果你想要一个热情的建议,你应该看看这出戏!框架HTTP流