gpt4 book ai didi

java:如何设置全局线程ID?

转载 作者:行者123 更新时间:2023-11-30 06:29:19 25 4
gpt4 key购买 nike

是否可以为线程设置唯一 ID?在许多不同机器上创建线程的分布式系统中(例如通过 RMI)?

我需要它来创建日志消息。根据我的研究,我知道它可以使用 log4j mdc/ndc 来完成,但只能在单线程中完成。我的问题是必须在创建线程时设置 ID(为不同 JVM 上的线程使用相同的 ID 但对于相同的请求)

我是分布式系统的新手。

最佳答案

如果您想要一个全局唯一的请求 ID,您可以使用带有计数器的 prcoessAndName(见下文)并将其与您的消息/请求一起传递,并使用它来设置线程名称。

public void processRequest(String uniqueRequestId, args) {
Thread t = Thread.currrentThread();
String tName = t.getName();
try {
t.setName("Processing " + uniqueRequestId);
// preform process request
} finally {
t.setName(tName);
}
}

这样线程的名称将包含请求 ID,而不管它在哪个线程/机器中运行。如果您在日志中包含线程的名称,它将被包含在内。


您可以使用

设置线程的名称
String processAndHost = ManagementFactory.getRuntimeMXBean().getName()

您可以在此附加一个描述性名称或计数器。

这样您的所有线程名称都将是唯一的。

您可以假定此名称是全局唯一的,前提是:a) 您有一个唯一的主机名 b) 进程不会重新启动,因此经常存在两个客户端(在不同时间)在同一进程上具有相同进程 ID 的重大风险主机是个问题。

这可以与本地唯一 ID 结合,以获得分布式唯一 ID。

ExecutorService service = Executors.newCachedThreadPool(new ThreadFactory() {
final String processName = ManagementFactory.getRuntimeMXBean().getName();
final AtomicLong counter = new AtomicLong();
@Override
public Thread newThread(Runnable r) {
String name = processName+"-"+counter.getAndIncrement();
return new Thread(r, name);
}
});
for(int i=0;i<10;i++)
service.submit(new Runnable() {
@Override
public void run() {
System.out.println("["+Thread.currentThread().getName()+"] - Hello World.");
Thread.yield();
}
});
service.shutdown();

打印

[9480@myhost-0] - Hello World.
[9480@myhost-3] - Hello World.
[9480@myhost-2] - Hello World.
[9480@myhost-1] - Hello World.
[9480@myhost-5] - Hello World.
[9480@myhost-4] - Hello World.
[9480@myhost-6] - Hello World.
[9480@myhost-7] - Hello World.
[9480@myhost-0] - Hello World.
[9480@myhost-7] - Hello World.

关于java:如何设置全局线程ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11664741/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com