Java:ThreadLocal是什么?

ThreadLocal指的是每个线程使用的区域独立,互不干扰。

 

它的子类InheritableThreadLocal可以把数据传递给子线程。

一般创建为对象的静态属性。

 

常用方法:

  set (value)

  get(value)

  子类的initialValue(),用于设置初始值。

 

 


示例

代码:

public class LeaningThread {
    //线程存放数据的一块区域,每个线程相互独立。常用方法:set/get,子类的intialValue设置初始值
    private static ThreadLocal<Integer> threadLocal = new ThreadLocal(){
        @Override
        protected Integer initialValue() {
            //初始化的值为2
            return 2;
        }
    };

    public static void main(String[] args) throws InterruptedException {
        //获取main线程的ThreadLocal区域存放的值
        System.out.println(Thread.currentThread().getName()+":"+threadLocal.get());
        //修改
        threadLocal.set(20);
        //获取main线程的ThreadLocal区域存放的值
        System.out.println(Thread.currentThread().getName()+":"+threadLocal.get());
        Test t = new Test();
        t.start();
    }
    //内部类
    static class Test extends Thread{
        @Override
        public void run() {
            System.out.println(Thread.currentThread().getName()+":"+threadLocal.get());
            threadLocal.set(threadLocal.get()-3);
            System.out.println(Thread.currentThread().getName()+":"+threadLocal.get());
        }
    }
}

运行结果:

注意事项

关注 ThreadLocal 的归属问题,1、在构造器中调用,哪个线程调用的,就属于谁。2、run方法中,就是自己的。

示例代码:

public class LeaningThread {
    //线程存放数据的一块区域,每个线程相互独立。常用方法:set/get,子类的intialValue设置初始值
    private static ThreadLocal<Integer> threadLocal = new ThreadLocal(){
        @Override
        protected Integer initialValue() {
            //初始化的值为2
            return 2;
        }
    };

    public static void main(String[] args) throws InterruptedException {
        //修改main线程的值
        threadLocal.set(20);
        new Thread(new Test()).start();
    }
    //内部类
    static class Test implements Runnable{
        public Test(){
            //main线程调用的构造器
            System.out.println(Thread.currentThread().getName()+":"+threadLocal.get());
        }
        @Override
        public void run() {
            threadLocal.set(threadLocal.get()-3);
            System.out.println(Thread.currentThread().getName()+":"+threadLocal.get());
        }
    }
}

运行结果:

 


子类InheritableThreadLocal

一个存储区域可以往下带的子类,main线程开的Thread1,那么Thread1也使用这个区域。

示例代码:

public class LeaningThread {
    //线程存放数据的一块区域,每个线程相互独立。常用方法:set/get,子类的intialValue设置初始值
    //一个值可以往下带的子类,main开的Thread1,那么Thread1也使用这个区域
    private static ThreadLocal<Integer> threadLocal2 = new InheritableThreadLocal<>();

    public static void main(String[] args) throws InterruptedException {
        //修改main线程的值
        threadLocal2.set(20);
        new Thread(new Test()).start();
    }
    //内部类
    static class Test implements Runnable{
        public Test(){
            //main线程调用的构造器
            System.out.println(Thread.currentThread().getName()+":"+threadLocal2.get());
        }
        @Override
        public void run() {
            threadLocal2.set(threadLocal2.get()-3);
            System.out.println(Thread.currentThread().getName()+":"+threadLocal2.get());
        }
    }
}

运行结果:

 

posted @ 2022-11-14 00:39  在博客做笔记的路人甲  阅读(151)  评论(0编辑  收藏  举报