线程本地仅初始化为零

时间:2019-05-15 06:40:03

标签: java multithreading runnable thread-local

我正在使用以下代码实现线程本地示例,我想我会在输出中获取随机数,但是当调用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都是threadLocal.get(),它不应该发布随机数吗?

感谢您的帮助。

3 个答案:

答案 0 :(得分:3)

您将本地线程设置为零:

threadLocal.set((int) Math.random());

因为Math.random()返回01之间的双精度数,当您将其强制转换为int时,它会产生0

答案 1 :(得分:0)

之所以会这样,是因为Math.random()函数返回的伪随机double大于或等于0.0且小于1.0。当您将此数字转换为int值时,它将切除小数部分。结果,在大多数情况下,您将获得0值。

答案 2 :(得分:0)

如果您喜欢0到1000之间的随机数,则可以像

一样使用它
threadlocal.set((int)(Math.random() * 1000));