threadLocal两大使用场景
每次线程需要一个独享的对象
实现线程安全的SimpleDateFormat
######第一版(两个线程获取时间)
两个线程调用SimpleDateFormat 获取日期字符串
public class SimpleDateFormatThreadLocal {
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
String date = new SimpleDateFormatThreadLocal().date(10);
System.out.println(date); //1970-01-01 08:00:10
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
String date = new SimpleDateFormatThreadLocal().date(1000);
System.out.println(date);//1970-01-01 08:16:40
}
}).start();
}
public String date(int seconds){
Date date = new Date(1000*seconds);
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return sf.format(date);
}
}
第二版(十个线程获取时间)
十个线程获取时间字符串,就有10个线程,10个SimpleDateFormat对象. 写法很不优雅
public class SimpleDateFormatThreadLocal {
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
int finalI = i;
new Thread(new Runnable() {
@Override
public void run() {
String date = new SimpleDateFormatThreadLocal().date(finalI);
System.out.println(date);
}
}).start();
}
}
public String date(int seconds){
Date date = new Date(1000*seconds);
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return sf.format(date);
}
}
/**
1970-01-01 08:00:01
1970-01-01 08:00:07
1970-01-01 08:00:00
1970-01-01 08:00:08
1970-01-01 08:00:03
1970-01-01 08:00:04
1970-01-01 08:00:05
1970-01-01 08:00:06
1970-01-01 08:00:02
1970-01-01 08:00:09
*/
第三版(线程池获取时间)
第二版中使用for循环来创建线程,如果for循环中有1000个线程,就会带来频繁创建与销毁线程带来的性能上的开销
1000打印日期的任务,用线程池来执行
public class SimpleDateFormatThreadLocal {
private static ExecutorService service = Executors.newFixedThreadPool(10);
public static void main(String[] args) {
for (int i = 0; i < 1000; i++) {
int finalI = i;
service