如何获取servlet线程的线程ID?

时间:2011-06-01 03:09:51

标签: java servlets

就像标题一样。谷歌没有给我任何线索。

编辑:我的意思是获取执行servlet代码的线程。感谢。

编辑:为什么我需要这些信息,这是因为当执行许多线程时,它们的日志聚合在一个日志中,并且日志的顺序会中断。我希望在日志的每一行的前面插入一个线程ID,以便我可以跟踪每个线程的活动。

4 个答案:

答案 0 :(得分:4)

要求它实际上并不是一件有意义的事。

线程不属于servlet。相反,它们属于Web容器,用于运行请求......在某些点上涉及运行servlet方法。 servlet方法当然可以找出当前线程是什么......但是任何方法都可以。

Web容器也可能以允许您确定某些线程用于某些事物的方式使用线程组。但这将是高度具体的实施。

如果那不是您的意思,请完善您的问题。


  

我的意思是获取执行servlet代码的线程。

你的意思是当前执行servlet的代码吗?

然后我认为答案很简单 - “这是不可能的”。

一个应用程序线程无法在正在运行的程序找出另一个线程正在执行的代码。只有使用调试代理才能找到这种东西...所有应用程序线程都停止了。


  

我想在日志的每一行的前面插入一个线程ID,以便我可以跟踪每个线程的活动。

(那你为什么不直接问这个?)

log4j LoggingEvent包含创建事件的线程的名称。您可以在模式布局中使用%t将线程名称包含在日志文件中。您还可以编写自己的自定义Appender,根据事件的线程名称将事件过滤到不同的“流”中。

线程ID不可用于记录...除非您明确地将其插入(例如)日志消息字符串中。

答案 1 :(得分:1)

怎么样:

long threadId = Thread.currentThread().getId();

在servlet代码中?这将为您提供运行servlet的service()方法的线程的ID。显然,其中许多可以同时进行。或者你的意思是“servlet线程的id”吗?

答案 2 :(得分:1)

您可以使用以下代码获取当前线程组中的所有线程:

int active = Thread.activeCount();
Thread allThreads[] = new Thread[active];
active = Thread.enumerate(allThreads);

然后,您可以为返回数组的每个元素调用getId()。你可以通过首先爬到当前线程的根ThreadGroup来获得更好的效果。

您想要这些信息是什么?

答案 3 :(得分:0)

您只能使用 Thread.currentThread()。getId()获取当前的线程ID。如果要跟踪执行servlet的所有线程,请在名为 executedThreads 的请求中保留一个列表,并将当前线程ID添加到列表中。