gpt4 book ai didi

java - ThreadLocal 跨线程取值

转载 作者:搜寻专家 更新时间:2023-10-30 21:14:14 26 4
gpt4 key购买 nike

假设一个 ThreadLocal 变量对于不同的线程持有不同的值,是否可以从另一个线程访问一个 ThreadLocal 变量的值?

即在下面的示例代码中,是否可以在 t1 中从 t2 读取 TLocWrapper.tlint 的值?

public class Example
{
public static void main (String[] args)
{
Tex t1 = new Tex("t1"), t2 = new Tex("t2");
new Thread(t1).start();
try
{
Thread.sleep(100);
}
catch (InterruptedException e)
{}
new Thread(t2).start();
try
{
Thread.sleep(1000);
}
catch (InterruptedException e)
{}
t1.kill = true;
t2.kill = true;
}

private static class Tex implements Runnable
{
final String name;
Tex (String name)
{
this.name = name;
}
public boolean kill = false;
public void run ()
{
TLocWrapper.get().tlint.set(System.currentTimeMillis());
while (!kill)
{
// read value of tlint from TLocWrapper
System.out.println(name + ": " + TLocWrapper.get().tlint.get());
}
}
}
}
class TLocWrapper
{
public ThreadLocal<Long> tlint = new ThreadLocal<Long>();
static final TLocWrapper self = new TLocWrapper();
static TLocWrapper get ()
{
return self;
}
private TLocWrapper () {}
}

最佳答案

正如彼得所说,这是不可能的。如果您想要这种功能,那么从概念上讲,您真正想要的只是一个标准的 Map<Thread, Long>。 - 其中大多数操作将使用 Thread.currentThread() 键完成, 但您可以根据需要传入其他线程。

但是,这可能不是一个好主意。其一,持有对垂死线程的引用会弄乱 GC,因此您必须经历额外的步骤来制作键类型 WeakReference<Thread>。反而。而且我不相信 Thread无论如何都是一个很棒的 map 键。

所以一旦你超越了内置的便利性 ThreadLocal , 也许值得质疑是否使用 Thread对象作为关键是最好的选择?最好为每个线程提供唯一的 ID(字符串或整数,如果它们还没有更有意义的自然键),并简单地使用这些来关闭 map 。我知道你的例子是人为的,但你可以用 Map<String, Long> 做同样的事情并使用 "t1" 的键和 "t2" .

自从 Map 以来,它也可以说更加清晰代表您实际使用数据结构的方式; ThreadLocal 更像是具有访问控制魔法的标量变量,而不是集合,因此即使可以按需要使用它们,其他人在查看您的代码时也可能会更加困惑。

关于java - ThreadLocal 跨线程取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5180114/

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