【问题标题】:Thread Local only initializing to Zero线程本地仅初始化为零
【发布时间】:2019-05-15 06:40:02
【问题描述】:

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

感谢您对此的帮助。

【问题讨论】:

  • Math.random() 返回一个介于 0 和 1 之间的数字。(int) Math.random()0

标签: java multithreading runnable thread-local


【解决方案1】:

您将线程本地设置为零:

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

因为Math.random()01 之间返回一个double,所以当您将其转换为int 时,它将产生0

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      如果你喜欢 0 到 1000 之间的随机数,你可以像这样使用它

      threadlocal.set((int)(Math.random() * 1000)); 
      

      【讨论】:

        猜你喜欢
        • 2020-09-28
        • 1970-01-01
        • 2021-06-17
        • 1970-01-01
        • 1970-01-01
        • 2018-06-22
        • 2014-12-29
        • 1970-01-01
        • 2018-07-26
        相关资源
        最近更新 更多