java中的多线程Web应用程序

时间:2012-07-10 06:45:21

标签: java multithreading jsp

我正在做一个Web应用程序,它将Java作为前端,将shell脚本作为后端。这个概念是我需要在后端处理多个文件。我将从用户(例如7月1日至8日)获取日期范围,并且每天处理大约100个文件。总共我要处理800个文件。

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

现在我用顺序方法做了所有这些 - 我的意思是没有线程。因此,只有一个主线程执行,用户必须等待800个文件按顺序处理。然而,这真的很慢。因此,我正在考虑寻找线程。由于我是线程的初学者,我读了一些关于这个的东西,我想出了以下想法:

  

当我阅读线程时,工作必须分开..我想分裂了   8天工作到4个线程,每个线程将执行2天的工作


我想知道我是否采取了正确的方法,我的主要关注点是:

  1. 是否建议从Web应用程序生成多个线程
  2. 这是否是一个好方法
  3. 如何进行此操作的一些指导。一个示例实例会很棒。谢谢。

4 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

  1. 是的,从Web应用程序中生成多个线程没有任何问题。实际上,如果你正在运行一个Servlet容器(你很可能是因为你使用的是Java),它已经为你生成了多个线程。通常,Servlet容器将自动生成一个新线程(或重用一个池中的一个)来处理它收到的每个请求。

  2. 您的方法很好,我们认为您需要根据系统的硬件配置和Web服务的并发负载量,将线程数微调到合适的位置。另请注意,虽然启动一堆线程会减少处理所有数据所需的总时间,但在任何数据准备好返回给用户之前,它仍会留下潜在的大部分时间。因此,您可以按顺序执行较小的工作单元,并在准备好后立即将每批结果发布到用户界面,从而获得更好的结果。然后,用户仍然需要很长时间才能获得所有数据,但这几乎可以立即开始查看至少一部分数据。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

说,你必须看看如何

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

  • 通过回调此服务来递增地填充网页,该服务返回用于向DOM添加数据的JSON字符串。每当您得到答案时,如果这是部分答案,您再次拨打提供先前序列号的服务。

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

如果你想要一个温馨的建议,你应该看看Play!框架http://www.playframework.org/documentation/2.0.2/JavaStream HTTP流媒体。