java当前线程(java当前线程休眠一秒)

在java web当中,servlet在运行阶段,针对每个客户端的请求,都会创建一个线程,该线程调用servlet的实例谢邀。处理http请求的线程由JAVA WEB Server来管理。比如tomcat,jetty等。通常的作法是维护一个线程池,所有请求的执行都由这个线程池中的线程来完成,如果请求超过处理能力,就会发生等待甚至崩溃的...

在java web当中,servlet在运行阶段,针对每个客户端的请求,都会创建一个线程,该线程调用servlet的实例

谢邀。

处理http请求的线程由JAVA WEB Server来管理。比如tomcat,jetty等。通常的作法是维护一个线程池,所有请求的执行都由这个线程池中的线程来完成,如果请求超过处理能力,就会发生等待甚至崩溃的情况,因此根据业务的访问量合理的设置线程池大小是非常重要的。

以tomcat为例,下面的源代码是tomcat处理http请求初始化的代码。可以从源代码中看出,tomcat会初始化一个ThreadPoolExecutor实例,而其中的参数可以在tomcat配置文件中进行配置。


希望可以解答题主的疑问。

不是的。不是创建,创建通常指给程序分配空间,在Java中所谓创建线程是指创建线程实例。而Web容器中负责请求处理的Servlt只是初次或实例实在不够分配给引用的时候才创建实例(线程对象),否则通常情况下就直接启动个线程(针对每个请求)来接受并分发请求(调用实例)。另外,一般没有人会用它保管用户的状态,所以它的实例与访问量(请求对象个数)绝不对称。对称的是线程,且分发掉请求就立刻熄灭。实例如同太阳,线程如同太阳的光线(不占地方)。另外,像地球这么大儿的地儿,一般一个太阳就够了。一个站点慢或卡跟它没关系。

不是每个调用都有新线程产生,这样的话,并发量一上来不出几分钟就要挂了。主流的容器都有线程池,也就是最多同时可以接受多少连接,超过这个数的连接都要等待可用的线程才能处理。所以,在有空闲线程时不会创建新线程,就算没空闲线程也得满足条时才创建。

应该不是这样的原理

线程虽然异步,可以提升cpu的运行速率,但是线程过多也会造成cpu负荷过重,比如上下文切换,比如保存线程的堆栈信息等

而一般一个网站同时访问量会达到几百万到上千万,如果线程到达这个级别,服务器会卡死

java web其实是一种容器框架。实现线程安全的方法,简单的说就是不要存取属性。如果设计的不好,或者真是实际的需要,要在一个servlet实例中维持些状态、连接器等信息时,你需要实现初始化、避免冲突的管理任务。

如何监控Java线程池运行状态

如果想监控一个线程池的执行状态,线程池执行类ThreadPoolExecutor给出了相关的 API, 能实时获取线程池的以下信息:

  • 当前活动线程数

  • 正在排队中的线程数

  • 已经执行完成的线程数

  • 总线程数

  • ……

总线程数 = 排队线程数 + 活动线程数 + 执行完成的线程数

1. 代码示例

创建ThreadPoolExecutor实例:

通过ThreadPoolExecutor的API来获取线程运行信息:

2. 代码运行分析

线程池提交了 100000 个任务,但同时只有 50 个线程在工作,我们每间隔 3 秒来获取当前线程池的运行状态。

2.1 第一次程序输出

  • 当前排队线程数:99950

  • 当前活动线程数:50

  • 执行完成线程数:0

  • 总线程数(排队线程数 + 活动线程数 + 执行完成线程数):100000

2.2 第二次程序输出

  • 当前排队线程数:99800

  • 当前活动线程数:50

  • 执行完成线程数:150

  • 总线程数(排队线程数 + 活动线程数 + 执行完成线程数):100000

2.3 最后输出

  • 当前排队线程数:0

  • 当前活动线程数:0

  • 执行完成线程数:100000

  • 总线程数(排队线程数 + 活动线程数 + 执行完成线程数):100000

因此,了解清楚这些 API 的使用方法后,我们想监控线程池的状态就非常方便了。

欢迎关注笔者,持续分享有价值的优质架构文章。