• 2.java线程之ThreadLocal


    ThreadLocal即线程本地化变量,使用场合主要解决多线程中数据因并发产生不一致问题。ThreadLocal为每个线程的中并发访问的数据提供一个副本,通过访问副本来运行业务,这样的结果是耗费了内存,但是大大减少了线程同步所带来性能消耗,也减少了线程并发控制的复杂度。

    下面的例子是实现日志记录的功能,每个线程都有对应的日志文件。

     1 package com.thread.test;
     2 
     3 import java.io.IOException;
     4 import java.util.logging.FileHandler;
     5 import java.util.logging.Level;
     6 import java.util.logging.Logger;
     7 
     8 public class ThreadLogger {
     9 
    10     private static final ThreadLocal<Logger> threadLocal = new ThreadLocal<Logger>();
    11     
    12     public static void log(String msg){
    13         getThreadLogger().log(Level.INFO,msg);
    14     }
    15     
    16     /**
    17      * 从ThreadLocal中获取当前线程对应的Logger对象,如果ThreadLocal中没有保存当前线程对应的Logger对象
    18      * 则新建一个Logger对象,并放入ThreadLocal中。
    19      * @return
    20      */
    21     public static Logger getThreadLogger(){
    22         Logger logger = threadLocal.get();    // 获取当前线程的Logger对象
    23         if(logger == null){
    24             logger = Logger.getLogger(Thread.currentThread().getName());
    25             try {
    26                 logger.addHandler(new FileHandler(Thread.currentThread().getName() + ".log"));
    27             } catch (SecurityException e) {
    28                 e.printStackTrace();
    29             } catch (IOException e) {
    30                 e.printStackTrace();
    31             }
    32             
    33             threadLocal.set(logger);    //添加副本
    34         }
    35         
    36         return logger;
    37     }
    38 }
     1 package com.thread.test;
     2 
     3 public class Main {
     4 
     5     
     6     public static void main(String[] args) {
     7         /*MyThread myThread = new MyThread();
     8         new Thread(myThread).start();
     9         new Thread(myThread).start();*/
    10         
    11         new TestThread("t1").start();
    12         new TestThread("t2").start();
    13         new TestThread("t3").start();
    14     }
    15 
    16 }
    17 
    18 class TestThread extends Thread{
    19     
    20     public TestThread(String name) {
    21         super(name);
    22     }
    23     
    24     @Override
    25     public void run() {
    26         for(int i=1;i<5;i++){
    27             ThreadLogger.log(getName()+":message"+i);
    28         }
    29     }
    30 }

    ---------------------------------------------------- 誑逩の蝸犇 : I believe Nothing is impossible. ----------------------------------------------------

  • 相关阅读:
    hdu 5534(dp)
    hdu 5533(几何水)
    hdu 5532(最长上升子序列)
    *hdu 5536(字典树的运用)
    hdu 5538(水)
    假如数组接收到一个null,那么应该怎么循环输出。百度结果,都需要提前判断。否则出现空指针异常。。我还是想在数组中实现保存和输出null。
    第一个登录页面 碰到的疑问
    浅谈堆和栈的区别
    Java中的基础----堆与栈的介绍、区别
    JS的Document属性和方法
  • 原文地址:https://www.cnblogs.com/cody1988/p/2215116.html
Copyright © 2020-2023  润新知