线程本地仅初始化为零
Thread Local only initializing to Zero
我正在使用以下代码实现线程本地示例,我以为我会在输出中获取随机数,但是当调用 threadLocal.get()
方法时,我得到所有线程 n 输出的零,是我在这里遗漏了一些东西。这是我的代码和输出,将非常感谢您的帮助。提前致谢。
package concurrency;
public class ThreadLocalExample {
public static void main(String[] args) throws InterruptedException {
SubLocalClass subLocalClass = new SubLocalClass();
for(int i=0;i<10;i++) {
Thread thread = new Thread(subLocalClass);
thread.start();
thread.join();
}
}
}
class SubLocalClass implements Runnable{
private ThreadLocal<Integer> threadLocal = new ThreadLocal<Integer>() {
protected Integer initialValue() {
return 1000;
}
};
@Override
public void run() {
threadLocal.set((int) Math.random());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getId()+" "+
Thread.currentThread().getName()+" "+threadLocal.get());
}
}
我得到的输出是这个
12 Thread-0 0
13 Thread-1 0
14 Thread-2 0
15 Thread-3 0
16 Thread-4 0
17 Thread-5 0
18 Thread-6 0
19 Thread-7 0
20 Thread-8 0
21 Thread-9 0
为什么0
for threadLocal.get()
for all the threads,不应该发布随机数吗?
感谢您对此的帮助。
它发生是因为Math.random()
函数returns伪随机double
大于或等于0.0且小于1.0。当您将此数字转换为 int
值时,它会切断小数部分。因此,在大多数情况下,您将收到 0 个值。
您将本地线程设置为零:
threadLocal.set((int) Math.random());
因为 Math.random()
returns 0
和 1
之间的双精度数,当您将其转换为 int 时,它将产生 0
.
如果你喜欢 0 到 1000 之间的随机数,你可以像
threadlocal.set((int)(Math.random() * 1000));
我正在使用以下代码实现线程本地示例,我以为我会在输出中获取随机数,但是当调用 threadLocal.get()
方法时,我得到所有线程 n 输出的零,是我在这里遗漏了一些东西。这是我的代码和输出,将非常感谢您的帮助。提前致谢。
package concurrency;
public class ThreadLocalExample {
public static void main(String[] args) throws InterruptedException {
SubLocalClass subLocalClass = new SubLocalClass();
for(int i=0;i<10;i++) {
Thread thread = new Thread(subLocalClass);
thread.start();
thread.join();
}
}
}
class SubLocalClass implements Runnable{
private ThreadLocal<Integer> threadLocal = new ThreadLocal<Integer>() {
protected Integer initialValue() {
return 1000;
}
};
@Override
public void run() {
threadLocal.set((int) Math.random());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getId()+" "+
Thread.currentThread().getName()+" "+threadLocal.get());
}
}
我得到的输出是这个
12 Thread-0 0
13 Thread-1 0
14 Thread-2 0
15 Thread-3 0
16 Thread-4 0
17 Thread-5 0
18 Thread-6 0
19 Thread-7 0
20 Thread-8 0
21 Thread-9 0
为什么0
for threadLocal.get()
for all the threads,不应该发布随机数吗?
感谢您对此的帮助。
它发生是因为Math.random()
函数returns伪随机double
大于或等于0.0且小于1.0。当您将此数字转换为 int
值时,它会切断小数部分。因此,在大多数情况下,您将收到 0 个值。
您将本地线程设置为零:
threadLocal.set((int) Math.random());
因为 Math.random()
returns 0
和 1
之间的双精度数,当您将其转换为 int 时,它将产生 0
.
如果你喜欢 0 到 1000 之间的随机数,你可以像
threadlocal.set((int)(Math.random() * 1000));