I want to fly higher
          programming Explorer
          posts - 114,comments - 263,trackbacks - 0
              直接看代碼示例
              
          package com.book.java7.concurrency;

          import java.time.LocalDate;
          import java.util.concurrent.TimeUnit;

          /**
           * {@link InheritableThreadLocal}示例
           * 
           * <pre>
           * public class InheritableThreadLocal<T> extends ThreadLocal<T> {
           *     protected T childValue(T parentValue) {
           *         return parentValue;
           *     }
           * </pre>
           * 
           * <pre>
           *     childValue方法是在子線程初始化時調用的,可(Thread.dump).將【子線程-childValue】和date綁定.
           *  子線程調用date.get時, 會取到子線程初始化時放到ThreadLocalMap的值.
           * </pre>
           * 
           * <p>
           * landon認為其實是用線程局部變量這個類更多的原因可能在于為了隱藏線程內部的一些實現細節,使用戶外部調用更簡單,完全不必理會線程內部的一些東西!
           * 
           * @author landon
           *
           
          */

          public class InheritableThreadLocalExample {

              
          private static class Task implements Runnable {

                  
          // InheritableThreadLocal局部變量
                  private static InheritableThreadLocal<LocalDate> date = new InheritableThreadLocal<LocalDate>() {
                      
          // 初始化
                      protected LocalDate initialValue() {
                          
          return LocalDate.now();
                      }


                      
          // 首先輸出繼承的值.然后改變子線程局部變量的值(加了一天)
                      protected LocalDate childValue(LocalDate parentValue) {
                          
          // Thread.dumpStack();

                          System.out.println(String.format("call childValue Thread:%s,parentValue:%s", Thread.currentThread()
                                  .getName(), parentValue));

                          
          return parentValue.plusDays(1);
                      }

                  }
          ;

                  @Override
                  
          public void run() {
                      System.out.println(String.format("%s:task begin.date:%s", Thread.currentThread().getName(), date.get()));

                      
          try {
                          TimeUnit.SECONDS.sleep(1);
                      }
           catch (InterruptedException e) {
                          e.printStackTrace();
                      }


                      
          // 創建一個子線程
                      
          // 從輸出可以看到:此時輸出的是childValue改變后的值
                      Thread subThread = new Thread(Thread.currentThread().getName() + "-sub"{
                          @Override
                          
          public void run() {
                              System.out.println(String.format("%s:task execute.date:%s", Thread.currentThread().getName(),
                                      date.get()));
                          }

                      }
          ;

                      subThread.start();

                      System.out.println(String.format("%s:task end.date:%s", Thread.currentThread().getName(), date.get()));
                  }

              }


              
          public static void main(String[] args) throws Exception {
                  Task task = new Task();

                  
          for (int i = 0; i < 3; i++{
                      Thread t 
          = new Thread(task, "Main-Sub-" + i);
                      t.start();

                      Thread.sleep(
          1000);
                  }

              }

          }

          posted on 2014-11-25 16:22 landon 閱讀(6148) 評論(0)  編輯  收藏 所屬分類: Program
          主站蜘蛛池模板: 嘉定区| 宁明县| 南漳县| 保靖县| 鹤岗市| 康乐县| 黄骅市| 石楼县| 平遥县| 西平县| 阆中市| 博野县| 锡林浩特市| 榕江县| 裕民县| 屏东市| 靖远县| 临西县| 广南县| 札达县| 湟源县| 通许县| 呼玛县| 苏尼特左旗| 芷江| 保康县| 乌鲁木齐县| 高阳县| 周口市| 大同市| 焦作市| 乌兰县| 山西省| 德安县| 泸溪县| 都江堰市| 万全县| 方正县| 江安县| 武山县| 吐鲁番市|