import java.text.SimpleDateFormat; import java.util.Date; /* * 两个线程打印日期 * */ public class ThreadLocalNormalUsage00 { public String date(int seconds){ //参数单位是毫秒,从1970.1.1 00:00:00 GMT计时,乘以1000是转换成秒 Date date = new Date(1000*seconds); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-mm-dd hh:mm:ss"); return simpleDateFormat.format(date); }
public static void main(String[] args) { new Thread(new Runnable() { @Override public void run() { String date = new ThreadLocalNormalUsage00().date(10); System.out.println(date); } }).start(); new Thread(new Runnable() { @Override public void run() { String date = new ThreadLocalNormalUsage00().date(1007); System.out.println(date); } }).start(); } }
/* * 1000个打印日期任务,使用线程池来执行 * */ public class ThreadLocalNormalUsage02 { public static ExecutorService threadPool = Executors.newFixedThreadPool(10); public String date(int seconds){ //参数单位是毫秒 Date date = new Date(1000*seconds); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-mm-dd hh:mm:ss"); return simpleDateFormat.format(date); }
public static void main(String[] args){ for (int i = 0; i < 1000; i++) { int finalI = i; threadPool.submit(new Runnable() { @Override public void run() { String date = new ThreadLocalNormalUsage02().date(finalI); System.out.println(date); } });
/* * 利用threadLocal,给每个线程分配自己的dateFormat对象,保证线程安全,高效利用内存 * */ public class ThreadLocalNormalUsage05 { public static void main(String[] args){ for (int i = 0; i < 1000; i++) { int finalI = i; threadPool.submit(new Runnable() { @Override public void run() { String date = new ThreadLocalNormalUsage05().date(finalI); System.out.println(date); } });
} threadPool.shutdown(); } public static ExecutorService threadPool = Executors.newFixedThreadPool(10); public String date(int seconds){ //参数单位是毫秒 Date date = new Date(1000*seconds); // SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-mm-dd hh:mm:ss"); SimpleDateFormat dateFormat = ThreadSafeFormatter.dateFormatThreadLocal.get(); return dateFormat.format(date); } } class ThreadSafeFormatter{ public static ThreadLocal<SimpleDateFormat> dateFormatThreadLocal = new ThreadLocal<SimpleDateFormat>(){ protected SimpleDateFormat initialValue(){ return new SimpleDateFormat("yyyy-mm-dd hh:mm:ss"); } };
package threadlocal; /* * 演示ThreadLocal用法2:避免传递参数的麻烦 * */ public class ThreadLocalNormalUsage06 { public static void main(String[] args) { new Service1().process(); } } class UserContextHolder{ public static ThreadLocal<User> holder = new ThreadLocal<>();
} class User{ String name; public User(String name) { this.name = name; } } class Service1{ public void process(){ User user = new User("tom"); UserContextHolder.holder.set(user); new Service2().process(); } } class Service2{ public void process(){ User user = UserContextHolder.holder.get(); System.out.println("Service2拿到用户名:"+user.name); new Service3().process(); } } class Service3{ public void process(){ User user = UserContextHolder.holder.get(); System.out.println("Service3拿到用户名:"+user.name); } }
ThreadLocal的两个作用
1.让某个需要用到的对象在线程间隔离(每个线程都有自己独立的对象)
1 2 3 4 5 6
public static ThreadLocal<SimpleDateFormat> dateFormatThreadLocal = new ThreadLocal<SimpleDateFormat>(){ protected SimpleDateFormat initialValue(){ return new SimpleDateFormat("yyyy-mm-dd hh:mm:ss"); } };
2.在任何方法中都可以轻松获取对象
1 2 3 4 5 6 7 8 9 10 11
class UserContextHolder{ public static ThreadLocal<User> holder = new ThreadLocal<>();
} class Service1{ public void process(){ User user = new User("tom"); UserContextHolder.holder.set(user); new Service2().process(); } }