如何从线程池中获取线程ID?
我有一个固定的线程池,可以向其提交任务(仅限 5 线程)。我如何找出其中哪个 5 线程执行我的任务(例如“5 的线程 #3 正在执行此任务”)?
ExecutorService taskExecutor = Executors.newFixedThreadPool(5);
//in infinite loop:
taskExecutor.execute(new MyTask());
....
private class MyTask implements Runnable {
public void run() {
logger.debug("Thread # XXX is doing this task");//how to get thread id?
}
}
I have a fixed thread pool that I submit tasks to (limited to 5 threads). How can I find out which one of those 5 threads executes my task (something like "thread #3 of 5 is doing this task")?
ExecutorService taskExecutor = Executors.newFixedThreadPool(5);
//in infinite loop:
taskExecutor.execute(new MyTask());
....
private class MyTask implements Runnable {
public void run() {
logger.debug("Thread # XXX is doing this task");//how to get thread id?
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
使用Thread.currentThread():
Using
Thread.currentThread()
:接受的答案回答了有关获取a线程ID的问题,但它不允许您执行“Thread X of Y”消息。线程 ID 在线程之间是唯一的,但不一定从 0 或 1 开始。
这是一个匹配问题的示例:
和输出:
使用模算术进行轻微调整将允许您正确执行“线程 X of Y”:
新结果:
The accepted answer answers the question about getting a thread id, but it doesn't let you do "Thread X of Y" messages. Thread ids are unique across threads but don't necessarily start from 0 or 1.
Here is an example matching the question:
and the output:
A slight tweak using modulo arithmetic will allow you to do "thread X of Y" correctly:
New results:
您可以使用 Thread.getCurrentThread.getId(),但是当 LogRecord 由记录器管理的对象已经具有线程 ID。我认为您在某处缺少记录日志消息的线程 ID 的配置。
You can use Thread.getCurrentThread.getId(), but why would you want to do that when LogRecord objects managed by the logger already have the thread Id. I think you are missing a configuration somewhere that logs the thread Ids for your log messages.
如果您正在使用日志记录,那么线程名称将会很有帮助。
线程工厂可以帮助解决这个问题:
输出:
If you are using logging then thread names will be helpful.
A thread factory helps with this:
Output:
如果您的类继承自 Thread,您可以使用方法
getName
和setName
来命名每个线程。否则,您只需将name
字段添加到MyTask
中,并在构造函数中对其进行初始化。If your class inherits from Thread, you can use methods
getName
andsetName
to name each thread. Otherwise you could just add aname
field toMyTask
, and initialize it in your constructor.当前线程的获取方式是:
获得Thread类对象(t)后,就可以使用Thread类的方法来获取所需的信息。
线程 ID 获取:
线程名称获取:
There is the way of current thread getting:
After you have got Thread class object (t) you are able to get information you need using Thread class methods.
Thread ID gettting:
Thread name gettting:
Thread.currentThread.getId()
的方法getId
自 19 起已弃用。如果使用,则会发出警告,建议使用
The method
getId
ofThread.currentThread.getId()
is deprecated since 19. If used it will give warning asIt is recommended to use