gpt4 book ai didi

java - 无法获取 Threadlocal 值

转载 作者:行者123 更新时间:2023-11-29 07:37:02 24 4
gpt4 key购买 nike

我正在尝试使用线程局部变量按以下顺序使用三个不同的线程打印数字 0、1、2 等:

0- thread 0
1- Thread 1
2- Thread 2
3- thread 0
4- Thread 1
.
.

下面是我将整数放入线程本地存储并将其与每个线程递增的原子整数进行比较的代码。

  public class alternate123 
{

public static void main(String as[])
{
Object ob = new Object ();AtomicInteger t = new AtomicInteger(0);

Thread t1 = new Thread ( new printpattern(t,0),"t0");
Thread t2 = new Thread ( new printpattern(t,1),"t1");
Thread t3 = new Thread ( new printpattern(t,2),"t2" );

t1.start();
t2.start();
t3.start();



}

}
class printpattern implements Runnable
{
//Integer t ;
//Object ob = new Object ();
AtomicInteger ai;
private ThreadLocal<Integer> t = new ThreadLocal<Integer>() ;
public printpattern(AtomicInteger at,Integer i)
{
//
ai=at;
t.set(i);
}
@Override
public void run()
{
// TODO Auto-generated method stub

synchronized (ai) {
while (true)
{if (ai.get()%3==
t.get()) // ----------------------- null pointer exception here
{
try {
ai.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
try {
Thread.sleep(300);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Current thread id "+Thread.currentThread().getName()+"value of integer is "+ai.get());;
ai.incrementAndGet();
ai.notify();
}
}
}

}

我在尝试执行 t.get() 时得到 null,下面是堆栈跟踪:

Exception in thread "t2" java.lang.NullPointerException
at printpattern.run(alternate123.java:46)
at java.lang.Thread.run(Thread.java:619)
Exception in thread "t0" java.lang.NullPointerException
at printpattern.run(alternate123.java:46)
at java.lang.Thread.run(Thread.java:619)
Exception in thread "t1" java.lang.NullPointerException
at printpattern.run(alternate123.java:46)
at java.lang.Thread.run(Thread.java:619)

我正在使用 set 方法设置线程局部变量,我怀疑这是错误的。请让我知道可能是什么问题。

最佳答案

构造函数在您的主线程中被调用,因此该值是为该线程设置的:您必须在 run 方法中设置线程局部值。只需将整数值(构造函数中的 i 参数)存储为 printpattern 类中的字段,然后在 run 方法中调用 t.set(i)。

P.S.:请将 printpattern 重命名为 PrintPattern - 这是一个类。

关于java - 无法获取 Threadlocal 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34452207/

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