日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ThreadLocal两个简单示例

發布時間:2025/1/21 编程问答 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ThreadLocal两个简单示例 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

ThreadLocal作用:

通常我們創建的變量可以被任一個線程訪問并修改,如果想實現每一個線程都有自己專屬本地變量時,該變量不受其他線程影響,此時可以使用ThreadLocal。

  • ThreadLocal有三個常用方法,set()、get()、remove()。ThreadLocal<Integer> local = new ThreadLocal<>();

  • 調用local.set()方法,對當前線程進行賦值。事實上set的值保存在當前線程的ThreadLocalMap中,而不是ThreadLocal中,ThreadLocal可以看作僅對ThreadLocalMap進行了封裝,只傳遞參數,ThreadLocalMap可以看作是為ThreadLocal定制的HashMap。存放時,key就是ThreadLocal對象即這里定義的local,我們添加的變量Integer值作為value來存放。每個線程都有自己的ThreadLocalMap

  • 當我們在同一個線程中定義了第二個或多個ThreadLocal時,ThreadLocal<Integer> local2 = new ThreadLocal<>(); 接著通過local2.set()進行賦值時,值還會保存到僅有的一個ThreadLocalMap中,而不會再創建一個ThreadLocalMap。源碼中是這樣,兩個ThreadLocal屬于同一線程,就直接往map中添加元素,所以只存在一個ThreadLocalMap:

  • public void set(T value) {Thread t = Thread.currentThread();ThreadLocalMap map = getMap(t);if (map != null)map.set(this, value);elsecreateMap(t, value);}
  • local.get()、local2.get()分別獲取到的是當前線程中我們存放的Integer變量值。

  • 示例1:

    使用線程池(順便學一下線程池的使用哈哈)創建10個線程來存放Integer值 1-10。

    public class ThreadLocalTest {public static void main(String[] args) throws InterruptedException{ThreadLocal<Integer> local = new ThreadLocal<>();//創建一個線程池,初始化10個線程,最多15個線程,60SECONDS,多出的線程經過60s沒活就回收,// 保持10個線程,new LinkedBlockingQueue() 用來放任務的集合ThreadPoolExecutor threadPool = new ThreadPoolExecutor(10,15,60, TimeUnit.SECONDS,new LinkedBlockingQueue<Runnable>());for (int i = 0; i < 10; i++) {int I = i + 1;//執行一次為一個線程,執行十次共10個線程threadPool.execute(new Runnable() {@Overridepublic void run() {local.set(I);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName()+" 的Integer值為:"+ local.get() );}});}threadPool.shutdown();} }


    實例2:

    public class Person {private int age;private String name;public Person(final int age, final String name) {this.age = age;this.name = name;}public int getAge() {return this.age;}public void setAge(final int age) {this.age = age;}public String getName() {return this.name;}public void setName(final String name) {this.name = name;}@Overridepublic String toString() {return "Person{" +"age=" + age +", name='" + name + '\'' +'}';} } public class ThreadLocalTest1 {public static void main(String[] args) {ThreadLocal<Person> local = new ThreadLocal<>();Person p1 = new Person(23,"張三");Person p2 = new Person(45,"李四");Person p3 = new Person(76,"王五");Person p4 = new Person(98,"趙六");ArrayList<Person> list = new ArrayList<>();list.add(p1);list.add(p2);list.add(p3);list.add(p4);//創建一個線程池,初始化10個線程,最多15個線程,60SECONDS,多出的線程經過60s沒活就回收,// 保持10個線程,new LinkedBlockingQueue() 用來放任務的集合ThreadPoolExecutor threadPool = new ThreadPoolExecutor(10,15,60, TimeUnit.SECONDS,new LinkedBlockingQueue<Runnable>());for (int i = 0; i < 4; i++) {Person p = list.get(i);threadPool.execute(new Runnable() {@Overridepublic void run() {local.set(p);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName()+" 的Person為:"+ local.get() );}});}threadPool.shutdown();} }


    總結

    以上是生活随笔為你收集整理的ThreadLocal两个简单示例的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。