Доступ к значениям ThreadLocal из метода, вызванного потоком? - PullRequest
0 голосов
/ 17 февраля 2020

Я использовал ThreadLocal очень мало, однако мне нужно знать об этом по соображениям работы. Я выполнил поиск по этому вопросу и узнал о концепции.

Я сделал пример ниже:

ThreadLocalMain. java -> Программа основного драйвера

package com.example.threads.threadlocal;

public class ThreadLocalMain {
    public static void main(String[] args) throws InterruptedException {
        Thread1 t1 = new Thread1("First");
        Thread1 t2 = new Thread1("Second");
        Thread1 t3 = new Thread1("Third");

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

Thread1. java -> Который использует ThreadLocal

package com.example.threads.threadlocal;

import com.example.threads.threadlocal.utils.Util1;

public class Thread1 extends Thread {

    private static Integer unique_id = 0;
    @SuppressWarnings("rawtypes")
    private static ThreadLocal tl = new ThreadLocal() {

        @Override
        public Integer initialValue() {
            return (++unique_id);
        }
    };

    public Thread1(String name) {
        super(name);
    }

    @Override
    public void run() {
        System.out.println("Current thread is --> " + Thread.currentThread().getName() + " with thread local value as --> " + tl.get());

        Util1 u1 = new Util1();
        u1.display(tl);
    }

Util. java -> В этом Я хочу проверить значение ThreadLocal для Thread * Local


package com.example.threads.threadlocal.utils;

public class Util1 {
    public void display(ThreadLocal tl) {
        System.out.println("Inside Util1#display() method, executed by " + Thread.currentThread().getName()
                + " my thread local value is -->  " + tl.get());
    }
}

У меня есть основная драйверная программа, которая создает 3-ниточный поток, а в классе потока есть ThreadLocal, который сохраняет значения для текущего потока.

Мой вопрос заключается в том, как мы можем напечатать значение ThreadLocal для текущего потока, который вызвал метод для некоторого объекта. В этом случае объект Util. Я смог это сделать, передав экземпляр ThreadLocal в метод Util's display().

Так что мой вопрос:

Можно ли напечатать значение ThreadLocal в методе без передачи ThreadLocal ссылки на метод? Это вообще возможно? Является ли мой метод не таким, как он предназначен для использования ThreadLocal.

1 Ответ

1 голос
/ 19 февраля 2020

Поскольку вы не выполняете код в разных потоках в методе display , вы можете передать значение потока local вместо потока local методу display . Следующий код приведет к тому же результату

@Override
public void run() {
      System.out.println("Current thread is --> " + Thread.currentThread().getName() + " with thread local value as --> " + tl.get());

    Util u1 = new Util();
    u1.display(tl.get());
}

public class Util {
  public void display(Object value) {
    System.out.println("Inside Util1#display() method, executed by " + Thread.currentThread().getName()
            + " my thread local value is -->  " + value);
}

}

...