更新時(shí)間:2022-03-17 10:53:34 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽1495次
我們來(lái)看一下JavaWeb多線程ThreadLocal的簡(jiǎn)單使用,首先ThreadLocal肯定是全局共享的:
public class Tools
{
public static ThreadLocal<String> t1 = new ThreadLocal<String>();
}
寫一個(gè)線程往ThreadLocal里面塞值:
public class ThreadLocalThread extends Thread
{
private static AtomicInteger ai = new AtomicInteger();
public ThreadLocalThread(String name)
{
super(name);
}
public void run()
{
try
{
for (int i = 0; i < 3; i++)
{
Tools.t1.set(ai.addAndGet(1) + "");
System.out.println(this.getName() + " get value--->" + Tools.t1.get());
Thread.sleep(200);
}
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
寫個(gè)main函數(shù),啟動(dòng)三個(gè)ThreadLocalThread:
public static void main(String[] args) throws Exception
{
ThreadLocalThread a = new ThreadLocalThread("ThreadA");
ThreadLocalThread b = new ThreadLocalThread("ThreadB");
ThreadLocalThread c = new ThreadLocalThread("ThreadC");
a.start();
b.start();
c.start();
}
看一下運(yùn)行結(jié)果:
ThreadA get value--->1
ThreadC get value--->2
ThreadB get value--->3
ThreadB get value--->4
ThreadC get value--->6
ThreadA get value--->5
ThreadC get value--->8
ThreadA get value--->7
ThreadB get value--->9
看到每個(gè)線程的里都有自己的String,并且互不影響----因?yàn)榻^對(duì)不可能出現(xiàn)數(shù)字重復(fù)的情況。用一個(gè)ThreadLocal也可以多次set一個(gè)數(shù)據(jù),set僅僅表示的是線程的ThreadLocal.ThreadLocalMap中table的某一位置的value被覆蓋成你最新設(shè)置的那個(gè)數(shù)據(jù)而已,對(duì)于同一個(gè)ThreadLocal對(duì)象而言,set后,table中絕不會(huì)多出一個(gè)數(shù)據(jù),這里要注意,如果第一次沒有給ThreadLocal設(shè)置值的話,是會(huì)返回null的。
Java實(shí)驗(yàn)班
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
Java就業(yè)班
有基礎(chǔ) 直達(dá)就業(yè)
Java夜校直播班
業(yè)余時(shí)間 高薪轉(zhuǎn)行
Java在職加薪班
工作1~3年,加薪神器
Java架構(gòu)師班
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話與您溝通安排學(xué)習(xí)