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:
示例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两个简单示例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: synchronized修饰静态方法与实
- 下一篇: Atomic原子类常用方法总结(包含四大