高并发 threadlocal+countDownLatch+线程池走起来

  • 2019 年 11 月 28 日
  • 筆記
  • 线程池的创建和使用
  • threadlocal的使用
  • countDownLatch的使用
  • 高并发场景的使用
import io.netty.util.concurrent.DefaultThreadFactory;    import java.util.HashMap;  import java.util.Map;  import java.util.concurrent.*;    /**   * go go go   *   * @author [email protected] | [email protected] | 有问题可以邮箱或者github联系我   * @date 2019/11/23 9:07   */  public class ThreadLocalMain {          private static final int FOR_TIMES = 10;        @SuppressWarnings("unchecked")      public static void main(String[] args) throws InterruptedException {            ThreadLocal<Map> entry = new ThreadLocal<>();          CountDownLatch cdl = new CountDownLatch(10);          ThreadLocal<Integer> threadLocal = new ThreadLocal<>();              ThreadFactory threadFactory = new DefaultThreadFactory("pool");          ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(10, 61, 1, TimeUnit.MINUTES, new LinkedBlockingDeque<>(10000), threadFactory);          for (int i = 0; i < FOR_TIMES; i++) {              threadPoolExecutor.execute(() -> {                  try {                      threadLocal.set(3);                      cdl.await();                      Integer j = threadLocal.get();                      j++;                      printRet(j);                  } catch (InterruptedException e) {                      e.printStackTrace();                  }                    Map hashMap = new HashMap<>(16);                  hashMap.put("key", Thread.currentThread().getId());                  System.out.println(Thread.currentThread() + ":set:" + Thread.currentThread().getId());                  entry.set(hashMap);              });              cdl.countDown();          }          System.out.println("-------------------");          for (int i = 0; i < FOR_TIMES; i++) {              threadPoolExecutor.execute(() -> {                  Map map = entry.get();                  System.out.println(Thread.currentThread() + ":get:" + map.get("key"));              });          }            threadPoolExecutor.shutdown();            try {              // 等待线程全部执行完成              threadPoolExecutor.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS);          } catch (Exception e) {              e.printStackTrace();          }            // 判断线程是否全部执行完成          boolean terminated = threadPoolExecutor.isTerminated();            if (terminated) {              System.out.println("over");          }      }        private static void printRet(Integer integer) {          System.out.println(integer);      }      }