Answers:
我是否正确地说,对于Web应用程序,Web容器负责多线程处理?
大多数Web服务器(Java和其他包括JBoss的Web服务器)都遵循“每个请求一个线程”模型,即每个HTTP请求完全由一个线程完全处理。这个线程通常会花费大部分时间等待诸如DB请求之类的事情。Web容器将根据需要创建新线程。
一些服务器(在Java生态系统中主要是Netty)执行异步请求处理,或者使用“一个线程完成所有工作”模型,或者进行更复杂的处理。那里的基本思想是,拥有大量等待线程会浪费资源,因此异步工作会更有效率。
如果是这样,我可以在基于Web的应用程序中引入新的特色吗?
有可能,但是应该非常小心,因为错误(例如内存泄漏或缺少同步)会导致很难重现的错误或使整个服务器瘫痪。
这样做有什么好处,在哪种情况下需要这样做?
好吧,优点是您可以并行执行操作。使用线程来提高纯运算速度是你应该不是在一个网络服务器做,因为这将其他请求的处理变慢。这类事情应该在单独的服务器上完成,可能使用某种作业队列。
如果需要访问其他网络资源(例如,调用多个不同的Web服务),则可能是在处理HTTP请求的上下文中进行多线程的合法方案。如果您一次完成任务,则必须等待每个呼叫轮流完成。但是,如果使用多个线程,则总等待时间仅是单个最慢调用的延迟。
针对您的问题:
在基于Java的Web应用程序和独立Java应用程序中,多线程有何不同?
没什么两样 通常,构建的软件Web应用程序将通过使每个新请求成为一个线程来提供一些多线程。与其他任何应用程序一样,您可以使用/创建线程。
如果正确使用多线程,确实可以极大地提高性能。对于I / O密集型任务,例如网络访问和磁盘驱动器访问,几乎总是可以保证性能的提高。对于需要大量计算的任务,您应该遵循服务器中每个内核一个线程的规则。例如,如果您的核心具有i7处理器,则应坚持使用7个线程来执行计算任务。
针对您的问题:
这样做有什么好处,在哪种情况下需要这样做?
迈克尔·伯格沃特(Michael Borgwart)说,您不应这样做以提高计算速度。我不同意这一点,因为本文建议当用户需要完成计算繁重的任务时,多线程可以帮助提供响应能力。用简单的英语来说,用户无需等待很长时间即可完成具有多线程的计算繁重的任务。
如果您打算大量使用线程,建议您使用线程池。这将减少创建线程的开销。
好吧,这是一个很好的问题,我认为大多数从事Web应用程序开发的开发人员并未明确使用多线程。原因很明显,因为您正在使用应用程序服务器来部署应用程序,因此应用程序服务器在内部管理传入请求的线程池。
那为什么要显式使用多线程呢?Web应用程序开发人员需要暴露于多线程的情况是什么?
当您在大型应用程序上必须同时处理多个请求时,很难同时处理每种请求,因为特定种类的请求可能已经进行了大量处理,这可能会降低应用程序的性能。
让我们举个例子,一个Web应用程序在处理特定类型的请求后必须通过电子邮件和SMS通知用户。与请求线程同步执行此操作可能会降低Web应用程序的性能。因此,这里出现了多线程的作用。在这种情况下,建议通过网络开发一个独立的多线程应用程序,该应用程序仅负责发送电子邮件和SMS。
Concurrency Utilities
。