My Java Blog Park

          關(guān)于ThreadLocal的使用

          1.線程中要使用的類.各線程只有其一個(gè)引用.

          public class VarClass {
          ???
          ??? private static ThreadLocal threadVar=new ThreadLocal(){
          ??????? protected synchronized Object initialValue(){
          ??????????? System.out.println(Thread.currentThread().getName()+" initial value is 1");
          ??????????? return new Integer(1);
          ??????? }};
          ???
          ??? public int getValue(){
          ??????? return ((Integer)threadVar.get()).intValue();
          ??? }
          ???
          ??? public void setValue(){
          ??????? int a=getValue();
          ??????? a++;
          ??????? threadVar.set(new Integer(a));
          ??? }
          }


          2.線程類

          public class Worker extends Thread {
          ??? private long interval=0;
          ??? private boolean isRun=true;
          ??? private VarClass v=null;
          ???
          ??? public Worker(String name,VarClass v,long interval){
          ??????? setName(name);
          ??????? this.v=v;
          ??????? this.interval=interval;
          ??? }

          ??? public void run() {
          ??????? while(isRun){
          ??????????? try{
          ??????????????? Thread.sleep(interval);
          ??????????? }catch(InterruptedException e){
          ??????????????? e.printStackTrace();
          ??????????? }
          ??????????? v.setValue();
          ??????? }
          ??????? System.out.println(getName()+" is over at "+v.getValue());
          ??? }
          ???
          ??? public void stopThread(){
          ??????? isRun=false;
          ??? }
          }


          3.測試類
          public class TestThreadLocal {
          ?? public static void main(String[] args){
          ?????? VarClass v=new VarClass();
          ??????
          ?????? Worker w1=new Worker("Thread_A",v,100);
          ?????? Worker w2=new Worker("Thread_B",v,200);
          ?????? Worker w3=new Worker("Thread_C",v,300);
          ?????? Worker w4=new Worker("Thread_D",v,400);
          ?????? Worker w5=new Worker("Thread_E",v,500);
          ??????
          ?????? w1.start();
          ?????? w2.start();
          ?????? w3.start();
          ?????? w4.start();
          ?????? w5.start();
          ?????????????????????????
          ?????? System.out.println("All threads is over after 20 seconds");
          ??????
          ?????? //延時(shí)20秒后,終止5個(gè)線程
          ?????? try{
          ?????????? Thread.sleep(20000);
          ?????? }catch(InterruptedException e){
          ?????????? e.printStackTrace();
          ?????? }
          ??????
          ?????? System.out.println("All threads will be overed");
          ?????? w1.stopThread();
          ?????? w2.stopThread();
          ?????? w3.stopThread();
          ?????? w4.stopThread();
          ?????? w5.stopThread();
          ? }
          }


          4.測試結(jié)果:
          All threads is over after 20 seconds
          Thread_A initial value is 1
          Thread_B initial value is 1
          Thread_C initial value is 1
          Thread_D initial value is 1
          Thread_E initial value is 1
          All threads will be overed
          Thread_A is over at 200
          Thread_B is over at 101
          Thread_D is over at 51
          Thread_C is over at 68
          Thread_E is over at 42

          5.結(jié)果說明:雖然各線程使用的是同一個(gè)對象的引用,但由于使用了ThreadLocal,實(shí)際上每個(gè)線程所操作的數(shù)據(jù)是不一樣的.

          posted on 2006-09-25 16:18 2195113 閱讀(226) 評論(0)  編輯  收藏 所屬分類: Base Knowledge


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 正安县| 株洲市| 滁州市| 凤山县| 福安市| 鹤庆县| 靖宇县| 浠水县| 锦屏县| 米林县| 江华| 莫力| 行唐县| 辰溪县| 遂川县| 西丰县| 清原| 边坝县| 夏津县| 卢湾区| 鄂托克旗| 新源县| 建水县| 松溪县| 肃南| 大余县| 大英县| 射洪县| 元江| 日照市| 和平县| 松桃| 安化县| 历史| 兰溪市| 治县。| 林州市| 连州市| 淅川县| 溧阳市| 汾阳市|