如下代碼,未使用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線程設值的內容