Java多線程與併發應用-(5)-如何優雅的使用ThreadLocal類

內容來自,張孝祥老師的張孝祥-Java多線程與併發庫高級應用》視頻教程

package com.lipeng;

public class MyThreadLocalTest2 {

	private final static MyThreadLocal<String> myThreadLocal=new MyThreadLocal<String>();
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		new Thread(){
			public void run() {
				
				ThreadLocalData.getThreadLocalData().setAge(12);
				ThreadLocalData.getThreadLocalData().setName("張三");
				System.out.println(Thread.currentThread().getName()+"----------------"+A.getName());
				System.out.println(Thread.currentThread().getName()+"----------------"+B.getName());
			};
		}.start();
		new Thread(){
			public void run() {
				ThreadLocalData.getThreadLocalData().setAge(18);
				ThreadLocalData.getThreadLocalData().setName("李四");
				System.out.println(Thread.currentThread().getName()+"----------------"+A.getName());
				System.out.println(Thread.currentThread().getName()+"----------------"+B.getName());
				
			};
		}.start();

	}
	static class A
	{
		public static String getName()
		{
			return  ThreadLocalData.getThreadLocalData().getName();
		}
		
		public static void setName(String name)
		{
			myThreadLocal.set(name);
		}
	}
	
	static class B
	{
		public static String getName()
		{
			return  ThreadLocalData.getThreadLocalData().getName();
		}
		public static void setName(String name)
		{
			myThreadLocal.set(name);
		}
	}
}

class ThreadLocalData
{
	private static ThreadLocal<ThreadLocalData> threadLocal=new ThreadLocal<ThreadLocalData>();
	private String name;
	private int age;
	private ThreadLocalData(){  //不提供public的構造方法,只提供一個靜態工廠方法,此方法返回與當前線程有關的當前類的實例對象。
		
	}
	
	public static ThreadLocalData getThreadLocalData()
	{
		ThreadLocalData threadLocalData=threadLocal.get();
		if(threadLocalData==null)
		{
			threadLocalData=new ThreadLocalData();
			threadLocal.set(threadLocalData);
		}
		return threadLocalData;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
	
	
}


<span style="white-space:pre">	</span>我們在獲取一個與線程綁定的對象時,不希望看到ThreadLocal,而是直接得到與當前線程綁定的對象,在這裏,將線程綁定的類的構造方法private,提供一個靜態方法,使得要獲得這個類的對象,必須通過這個方法,而這個方法是從ThradLocal中get到的即使當前線程綁定的實例。








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章