在基于Java的Web应用程序和独立Java应用程序中,多线程有何不同?


13

我对Java相当陌生,我的经验仅限于在Web容器(本例中为Jboss)上运行的基于Web的应用程序。

我是否正确地说,对于Web应用程序,Web容器负责多线程处理?如果是这样,我可以在基于Web的应用程序中引入新的特色吗?这样做有什么好处,在哪种情况下需要这样做?


直到EE6,您都不得使用线程;EE7介绍Concurrency Utilities
恢复莫妮卡-M.Schröder2013年

Answers:


20

我是否正确地说,对于Web应用程序,Web容器负责多线程处理?

大多数Web服务器(Java和其他包括JBoss的Web服务器)都遵循“每个请求一个线程”模型,即每个HTTP请求完全由一个线程完全处理。这个线程通常会花费大部分时间等待诸如DB请求之类的事情。Web容器将根据需要创建新线程。

一些服务器(在Java生态系统中主要是Netty)执行异步请求处理,或者使用“一个线程完成所有工作”模型,或者进行更复杂的处理。那里的基本思想是,拥有大量等待线程会浪费资源,因此异步工作会更有效率。

如果是这样,我可以在基于Web的应用程序中引入新的特色吗?

有可能,但是应该非常小心,因为错误(例如内存泄漏或缺少同步)会导致很难重现的错误或使整个服务器瘫痪。

这样做有什么好处,在哪种情况下需要这样做?

好吧,优点是您可以并行执行操作。使用线程来提高纯运算速度是你应该不是在一个网络服务器做,因为这将其他请求的处理变慢。这类事情应该在单独的服务器上完成,可能使用某种作业队列。

如果需要访问其他网络资源(例如,调用多个不同的Web服务),则可能是在处理HTTP请求的上下文中进行多线程的合法方案。如果您一次完成任务,则必须等待每个呼叫轮流完成。但是,如果使用多个线程,则总等待时间仅是单个最慢调用的延迟。


3
说得通。ExecutorService接口是在Web应用程序中创建新线程的最佳方法吗?
kapricanon

4
@kapricanon:是的,除非您有一些无法满足的特定要求,否则您的Web服务器已经具有类似的功能。
Michael Borgwardt 2013年

2

针对您的问题:

在基于Java的Web应用程序和独立Java应用程序中,多线程有何不同?

没什么两样 通常,构建的软件Web应用程序将通过使每个新请求成为一个线程来提供一些多线程。与其他任何应用程序一样,您可以使用/创建线程。

如果正确使用多线程,确实可以极大地提高性能。对于I / O密集型任务,例如网络访问和磁盘驱动器访问,几乎总是可以保证性能的提高。对于需要大量计算的任务,您应该遵循服务器中每个内核一个线程的规则。例如,如果您的核心具有i7处理器,则应坚持使用7个线程来执行计算任务。

针对您的问题:

这样做有什么好处,在哪种情况下需要这样做?

迈克尔·伯格沃特(Michael Borgwart)说,您不应这样做以提高计算速度。我不同意这一点,因为本文建议当用户需要完成计算繁重的任务时,多线程可以帮助提供响应能力。用简单的英语来说,用户无需等待很长时间即可完成具有多线程的计算繁重的任务。

如果您打算大量使用线程,建议您使用线程池。这将减少创建线程的开销。


这如何回答所提问题?
蚊蚋

1
答案应各有千秋。如果您想发表评论,则必须先获得50个信誉点。
克里斯·

1

好吧,这是一个很好的问题,我认为大多数从事Web应用程序开发的开发人员并未明确使用多线程。原因很明显,因为您正在使用应用程序服务器来部署应用程序,因此应用程序服务器在内部管理传入请求的线程池。

那为什么要显式使用多线程呢?Web应用程序开发人员需要暴露于多线程的情况是什么?

当您在大型应用程序上必须同时处理多个请求时,很难同时处理每种请求,因为特定种类的请求可能已经进行了大量处理,这可能会降低应用程序的性能。

让我们举个例子,一个Web应用程序在处理特定类型的请求后必须通过电子邮件和SMS通知用户。与请求线程同步执行此操作可能会降低Web应用程序的性能。因此,这里出现了多线程的作用。在这种情况下,建议通过网络开发一个独立的多线程应用程序,该应用程序仅负责发送电子邮件和SMS。


为什么这个答案被否决?
Anurag Sharma 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.