Локальный поток только инициализация в ноль - PullRequest
0 голосов
/ 15 мая 2019

Я реализовывал пример 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 ]

3 голосов
/ 15 мая 2019

Вы устанавливаете локальный поток на ноль:

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

Поскольку Math.random() возвращает двойное значение между 0 и 1, когда вы приводите его к типу int, вы получите 0.

0 голосов
/ 15 мая 2019

Если вам нравится случайное число от 0 до 1000, вы можете использовать его как

threadlocal.set((int)(Math.random() * 1000)); 
0 голосов
/ 15 мая 2019

Это происходит потому, что функция Math.random() возвращает псевдослучайное double, большее или равное 0,0 и меньшее, чем 1,0.Когда вы приводите это число к значению int, оно отрезает дробную часть.В результате в большинстве случаев вы получите значение 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...