ThreadLocal 學習

ThreadLocal

ThreadLocal 不是一個線程,而是線程的一個本地化變量。當工作於多線程中的對象使用ThreadLocal維護變量時,ThreadLocal爲每個使用該變量的進程分配一個獨立的變量副本,所以每個線程可以獨立改變自己的副本,而不會影響其他線程的對應的副本。從線程的角度上來看,這個變量就是線程的一個本地變量。

  • 初始化函數 protected T initialValue() {}
  • 獲取變量的值 public T get() {}
  • 設置變量的值 public void set(T value) {}
  • 移除變量的值 public void remove() {}

使用ThreadLocal生成一個序列號,要求不同的線程進行各自的編號。

生成序列號的類

package com.seq;

/**
 * 實現生成序列號,並不同的線程生成各自的序列號
 * @author Duoduo
 * @version 1.0
 * @date 2017/4/23 19:40
 */
public class SequencenNumber {
    //定義一個線程變量,並初始化爲0
    private static  ThreadLocal<Integer> seqNumber = new ThreadLocal<Integer>(){
        @Override
        protected Integer initialValue() {
            return 0;
        }
    };

    /**
     * 返回下一個序列號
     * @return
     */
    public Integer getNextSeqNumber(){
        Integer curSeqNumber = seqNumber.get()+1;
        seqNumber.set(curSeqNumber);
        return  curSeqNumber;
    }

}

測試類

package com.seq;

import org.junit.Test;
import org.junit.Before;
import org.junit.After;

/**
 * SequencenNumber Tester.
 *
 * @author <Authors name>
 * @version 1.0
 * @since <pre>四月 23, 2017</pre>
 */
public class SequencenNumberTest {

    @Before
    public void before() throws Exception {
    }

    @After
    public void after() throws Exception {
    }

    /**
     * Method: getNextSeqNumber()
     */
    @Test
    public void testGetNextSeqNumber() throws Exception {

        SequencenNumber sequencenNumber = new SequencenNumber();

        //創建多個線程同時創建序列號
        Thread seqThread1 = new SeqTestThread(sequencenNumber);
        Thread seqThread2 = new SeqTestThread(sequencenNumber);
        Thread seqThread3 = new SeqTestThread(sequencenNumber);

        seqThread1.start();
        seqThread2.start();
        seqThread3.start();

    }


}

/**
 * 在線程裏面生成序列號
 */
class SeqTestThread extends Thread {
    SequencenNumber seqNumber;

    public SeqTestThread(SequencenNumber seqNumber) {
        this.seqNumber = seqNumber;
    }

    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            Integer curSeqNumber = seqNumber.getNextSeqNumber();
            System.out.println(Thread.currentThread().getName()+ " curSeqNumber : "+curSeqNumber);
        }
    }
}

測試結果

Thread-0 curSeqNumber : 1
Thread-2 curSeqNumber : 1
Thread-1 curSeqNumber : 1
Thread-2 curSeqNumber : 2
Thread-0 curSeqNumber : 2
Thread-0 curSeqNumber : 3
Thread-2 curSeqNumber : 3
Thread-1 curSeqNumber : 2
Thread-2 curSeqNumber : 4
Thread-0 curSeqNumber : 4
Thread-2 curSeqNumber : 5
Thread-1 curSeqNumber : 3
Thread-0 curSeqNumber : 5
Thread-1 curSeqNumber : 4
Thread-1 curSeqNumber : 5
發佈了54 篇原創文章 · 獲贊 15 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章