gpt4 book ai didi

java - 在线程启动前获取线程的 ThreadID

转载 作者:行者123 更新时间:2023-11-29 03:34:00 29 4
gpt4 key购买 nike

我有这种配对机制的想法,它通过 ThreadID 来识别客户端。当线程被销毁时,客户端的配对也被销毁,其ID被设置为-1。

现在为了让我获得线程 ID,线程当然必须已经运行或启动。

我想知道我是否可以创建一个线程,获取 ID,然后稍后设置可运行对象,或者我是否可以获取正在运行我的函数的当前线程的 ID。

我想做的事的例子:

void createClientThreaded(final Client client) {
new Thread(new Runnable() {
@Override public void run() {
while(!client.stop()) {
Utils.sleep(1000);
//Do other stuff here..

client.setThreadID(/* This Thread's ID */);

// Do other stuff here..
}
}
});
}

关于如何执行此操作的任何想法?另外,线程 ID 是每个进程唯一的还是整个系统唯一的?也就是说,同时运行的两个jar文件可以有相同的Thread ID吗?

最佳答案

线程 id 是不可变的,所以当线程终止时你不能将它设置为 -1。

id是线程一创建就创建的,不是线程一启动就创建,所以你可以创建线程,读取它的id,稍后再启动。

但是,如果您要创建和销毁大量线程,那么您将承担高昂的运行时成本。使用 ThreadPoolExecutor 会更有效率执行您的可运行对象,但是这排除了创建线程、读取其 id 和稍后启动线程的选项。另一种选择是创建您自己的类,该类使用可变 ID 实现 Runnable。

class MyRunnable implements Runnable {
private static AtomicLong idCounter = new AtomicLong(0);
private long id;

public MyRunnable() { this.id = idCounter.getAndIncrement(); }

public void setId(long id) { this.id = id; }
public long getId() { return this.id; }
public void run() {}
}

线程 ID 是每个进程的,而不是系统范围的。此外,进程可以重用线程 ID(例如,如果 id=5 的线程终止,则进程可以将 id=5 分配给新线程)。

关于java - 在线程启动前获取线程的 ThreadID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16493270/

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