Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 多线程-多用户_Java_Multithreading - Fatal编程技术网

Java 多线程-多用户

Java 多线程-多用户,java,multithreading,Java,Multithreading,当一个用户访问一个应用程序时,可以使用多个线程,如果存在多个内核,它们可以并行运行。如果只有一个处理器存在,那么线程将一个接一个地运行 当多个用户访问一个应用程序时,线程是如何处理的 Tomcat使用Java多线程支持来服务http请求 为了提供http请求,tomcat从线程池启动一个线程。为提高效率而维护池,因为创建线程的成本很高 有关并发性的更多信息,请参阅java文档 请参阅tomcat线程池配置以了解有关线程调度程序的更多信息。 事实上,在一个内核中,CPU将其时间分配给多个线程(进程

当一个用户访问一个应用程序时,可以使用多个线程,如果存在多个内核,它们可以并行运行。如果只有一个处理器存在,那么线程将一个接一个地运行


当多个用户访问一个应用程序时,线程是如何处理的

Tomcat使用Java多线程支持来服务http请求

为了提供http请求,tomcat从线程池启动一个线程。为提高效率而维护池,因为创建线程的成本很高

有关并发性的更多信息,请参阅java文档


请参阅tomcat线程池配置以了解有关线程调度程序的更多信息。 事实上,在一个内核中,CPU将其时间分配给多个线程(进程不是完全连续的)。在多核中,两个(或更多)线程可以同时运行。 阅读
我推荐。

我可以从Java的角度来谈,所以你的问题是“当多个用户访问一个应用程序时,线程是如何处理的?”。 答案是这完全取决于你是如何编程的,如果你使用一些web/app容器,它们提供了线程池机制,你可以有多个线程来处理服务器用户的请求,每个用户有一个启动的请求,然后由一个线程处理,因此,如果同时有10个用户,那么将有10个线程同时处理10个请求,现在我们有了非阻塞IO,现在请求处理可以卸载到其他线程,因此允许少于10个线程处理10个用户


现在,如果您想知道线程调度是如何围绕CPU核心完成的,这同样取决于操作系统。不过,有一个共同点是“线程是分配给CPU的基本单元”。从绿色线程开始,您将更好地理解它。

错误的关联是

如果只有一个处理器存在,那么线程将一个接一个地运行

线程的执行方式取决于运行时环境。 对于java,有些定义是,代码的某些部分不会导致与其他线程的同步,因此不会导致(潜在的)线程重新调度

通常,操作系统将负责调度执行单元。在过去的日子里,大多数这样的实体都是过程。现在可能会有进程和线程(有些只在线程级别进行调度)。为了简单起见,让我们将ssume操作系统仅用于处理线程

然后,操作系统可能会允许线程运行,直到到达无法继续的点,例如等待I/O操作完成。这对线程是好的,因为它可以最大限度地使用CPU。这对所有其他希望自己获得一些CPU周期的线程都是坏的。(通常情况下,线程总是比可用的CPU多。因此,问题与CPU的数量无关。)为了改善交互行为,操作系统可能会使用允许线程运行一定时间的时间片。时间片过期后,线程被强制从CPU中移除,操作系统选择一个新线程运行(甚至可能是刚刚中断的线程)

这将允许每个线程取得一些进展(为调度增加一些开销)。这样,即使在单处理器系统上,我的线程(似乎)也可以并行运行


因此,对于操作系统来说,一组线程是由单个用户(甚至是对web应用程序的一次调用)生成的还是由多个用户和web调用创建的并不重要。

有两点可以回答您的问题:
线程调度
&
线程通信

线程调度
实现是特定于操作系统的。程序员在这方面没有任何控制权,除了为
线程设置优先级

线程通信
程序/程序员
驱动

假设您有多个处理器和多个线程。多线程可以与多个处理器并行运行。但数据的共享和访问方式是特定于程序的


您可以并行运行线程,也可以等待线程完成执行后再继续(
join、invokeAll、CountDownLatch
等)。程序员可以完全控制线程生命周期管理

如果您有一个或多个用户,则没有区别。线程的工作取决于程序的逻辑。处理器将每个线程运行一段时间,然后再运行下一个线程。时间非常短,因此如果没有太多线程(或不同的进程)工作,用户不会注意到它。如果处理器使用一个20ms的单元,并且有1000个线程,那么每个线程都必须等待两秒钟才能进行下一轮。幸运的是,当前的处理器,即使只有一个核心,也有两个可用于并行线程的处理单元。

在“经典”实现中,到达同一端口的所有web请求首先由同一个单线程提供服务。然而,一旦收到请求(返回),几乎所有服务器都会立即分叉或重用另一个线程来完成请求。一些专用的单用户服务器和一些高级的下一代服务器,如may not

简单(和常见)的方法是在单个web请求(GET、POST等)的整个过程中选择或重用一个新线程。在请求被服务之后,该线程很可能会被重新用于可能属于相同或不同用户的另一个请求


但是,完全可以为服务器编写自定义代码,将特定线程绑定并重用到登录用户的web请求或IP地址。这可能难以扩展。我认为像Tomcat这样的标准简单服务器通常不会这样做

什么类型的应用程序?web应用程序