以下是我们生产中的应用程序日志的一部分。我们正在使用 log4j
配置:
<Console name="console" target="SYSTEM_OUT">
<PatternLayout
pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n" />
</Console>
[INFO ] 2018-03-10 15:47:16.905 [WebContainer : 23] Logger -
[INFO ] 2018-03-10 15:47:16.905 [WebContainer : 23] Logger -
[INFO ] 2018-03-10 15:49:27.320 [WebContainer : 19] Logger -
[INFO ] 2018-03-10 15:49:27.320 [WebContainer : 19] Logger -
[INFO ] 2018-03-10 15:49:27.320 [WebContainer : 19] Logger -
[INFO ] 2018-03-10 15:49:27.320 [WebContainer : 19] Logger -
[INFO ] 2018-03-10 15:49:27.320 [WebContainer : 19] Logger -
[INFO ] 2018-03-10 15:49:27.320 [WebContainer : 19] Logger -
[INFO ] 2018-03-10 15:54:23.703 [WebContainer : 23] Logger -
[INFO ] 2018-03-10 15:54:23.703 [WebContainer : 23] Logger -
[INFO ] 2018-03-10 15:54:23.703 [WebContainer : 23] Logger -
[INFO ] 2018-03-10 15:54:23.703 [WebContainer : 23] Logger -
从那里你可以看到有一个线程名称&#34; WebContainer:19&#34;和#34; WebContainer:23&#34;。我们对线程名称感到困惑。具有相同的线程名称是否意味着它们来自同一个请求?我们可以说15:54:23.703发生在2018-03-10 15:47:16.905之后并且属于同一个请求?
或
这些线程名称是否只是同一个类的一个进程组?并且上面的所有行都可以属于同一个请求,但只是在请求中执行的不同类的不同线程名称?
请赐教。
答案 0 :(得分:1)
每个web容器通常都有一个线程池。所有这些线程都会继续侦听套接字上的传入TCP连接并接受它们。一旦被接受,就可以从新建立的TCP连接中读取数据,解析并转换为HTTP请求。
你在这些日志中看到的“WebContainer:19”和“WebContainer:23”是两个这样的线程,属于webcontainer线程池。是的,他们是不同的。每当每个线程都有机会执行时,它就会显示在日志中,因此您正在观察这些日志语句中的随机化。
为了优雅地处理线程的这种随机性,并使应用程序正常运行,多线程概念是构建此类应用程序的必要条件。
答案 1 :(得分:0)
WebContainer:23是主题A. WebContainer:19是Thread B
A和B两个请求由WebContainer处理。