ThreadLocal的基本使用

如下代碼,未使用ThreadLocal情況下啓用五個線程設值與取值本地變量:

package com.xingsfdz.demo.util.Thread.threadlocal;

/**
 * 
 * @類名稱 TestThreadLocal.java
 * @類描述 <pre>未使用ThreadLocal測試</pre>
 * @作者  xingsfdz [email protected]
 * @創建時間 2020年4月11日 上午12:42:39
 * @版本 1.00
 *
 * @修改記錄
 * <pre>
 *     版本                       修改人 		修改日期 		 修改內容描述
 *     ----------------------------------------------
 *     1.00 	xingsfdz 	2020年4月11日             
 *     ----------------------------------------------
 * </pre>
 */
public class TestThreadLocal {
	
	//定義一個字符串變量
	private String content;
	
	//提供下get set方法
    public String getContent() {
		return content;
	}
	public void setContent(String content) {
		this.content = content;
	}

	//啓用五個線程再不適用ThreadLocal情況下設值與取值
	public static void main(String[] args) {
		TestThreadLocal demo = new TestThreadLocal();
		//使用內部類創建線程測試
		for(int i = 0; i < 5; i++){
			Thread thread = new Thread(new Runnable(){
				@Override
				public void run() {
					demo.setContent(Thread.currentThread().getName() + "線程設值的內容" );
					//打印變量 線程的變量
					System.out.println(Thread.currentThread().getName() + "線程的變量:" + demo.getContent());
				}
			});
			
			thread.setName("線程" + i);//線程名 0 - 4
			thread.start();//啓動線程
		}
	}
}

運行結果,因爲線程是隨機搶佔資源模式,所以我們只想多次發現,線程與變量的值出現了不對應的地方:

使用ThreadLocal來操作變量(修改下面部分代碼即可):

	//new一個ThreadLocal對象
	ThreadLocal<String> th = new ThreadLocal<>();
	//定義一個字符串變量
	//private String content;
	
	//提供下get set方法
    public String getContent() {
//		return content;
    	return th.get();
	}
	public void setContent(String content) {
//		this.content = content;
		th.set(content);
	}

運行結果(多次運行,線程與變量均一 一對應):

線程0線程的變量:線程0線程設值的內容
線程3線程的變量:線程3線程設值的內容
線程2線程的變量:線程2線程設值的內容
線程1線程的變量:線程1線程設值的內容
線程4線程的變量:線程4線程設值的內容

 

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