欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  网络运营

多线程学习之-ThreadLocal

程序员文章站 2022-03-06 15:57:21
一、ThreadLocal使用 在并发的环境中,每一个线程会将ThreadLocal的实例指向的内容拷贝一份到自己的工作副本中,在有很多线程使用一个相同的对象并且初始化的值是相同的时候,那么使用ThreadLocal是比较合适的。二、怎么给ThreadLocal初始化? 通过重写initialValue()方法,并返回一个泛型值,就可以初始化ThreadLocal:package com.example.thread;/** * ThreadLocal使用......

一、ThreadLocal使用

        在并发的环境中,每一个线程会将ThreadLocal的实例指向的内容拷贝一份到自己的工作副本中,在有很多线程使用一个相同的对象并且初始化的值是相同的时候,那么使用ThreadLocal是比较合适的。

 

二、怎么给ThreadLocal初始化?

     通过重写initialValue()方法,并返回一个泛型值,就可以初始化ThreadLocal:

package com.example.thread;

/**
 * ThreadLocal使用
 * @author FHQFIN06
 *  初始化threadLocal
 */

public class Demo05 {


	private static ThreadLocal<String> threadLocal=new ThreadLocal<String>(){
		@Override
		protected String initialValue() {
			// TODO Auto-generated method stub
			return "重写initialValue初始化值!";
		}
	};


	public static void main(String[] args) {
		//threadLocal.set("初始化一个值!");
		System.out.println(threadLocal.get());
		threadLocal.set("使用set设置一个值!");
		System.out.println(threadLocal.get());
		//打印结果为: 使用set设置一个值! 
	}
}

      ThreadLocal每个线程都有一份内容的拷贝,下面打印的结果为:

    

package com.example.thread;

import com.example.contructor.main;

/**
 * ThreadLocal 的使用
 * @author FHQFIN06
 *
 */

public class Demo06 {



	public static class MyDemo implements Runnable{
		private  static ThreadLocal<String> threadLocal=new ThreadLocal<String>();
		@Override
		public void run() {
			int v=(int)(Math.random()*100);
			System.out.println(Thread.currentThread().getId()+":"+v);
			threadLocal.set(v+"");
			System.out.println(Thread.currentThread().getId()+":"+threadLocal.get());
		}
	}


	public static void main(String[] args) throws InterruptedException {
		Thread thread1=new Thread(new MyDemo());
		Thread thread2=new Thread(new MyDemo());
		thread1.start();
		thread2.start();
		thread2.join();
		new MyDemo();
		//该线程为主线程,因此打印出来的threadLocal的内容为Null
		System.out.println(MyDemo.threadLocal.get());
	}

}

打印结果为:

  10:81
11:97
10:81
11:97
null

由于每个线程的副本是独立的,主线程没有对threadLocal进行set,因此获取到的值是null。

 

三、 InheritableThreadLocal

       InheritableThreadLocal 能够使子线程访问到主线程的数据, 即InheritableThreadLocal能允许一个线程创建的子线程访问父线程的值。

package com.example.thread;

public class Demo07 {
	
	private static InheritableThreadLocal<String> inLocal=new InheritableThreadLocal<String>();
	public static void main(String[] args) {
		 inLocal.set("主线程设置值");
		 Thread thread1=new Thread(new Demo07().new Son()); 
		 thread1.start();
	}
	
	
	public class Son implements Runnable{

		@Override
		public void run() {
			System.out.println(Thread.currentThread().getName()+"="+inLocal.get());
		}
		
	}

}

        如下打印结果为:

         Thread-0=主线程设置值

         由此发现子线程获取到了主线程set的值! 

本文地址:https://blog.csdn.net/qq_33036061/article/details/107613243

相关标签: 多线程