一、使用场景
- 每个线程需要一个独享的对象(通常是工具类,典型需要使用的类有SimpleDateFormat和Random)
- 每个线程内需要保存全局变量(例如在拦截器中获取用户信息),可以让不同方法直接使用,避免参数传递的麻烦。
1.每个线程需要一个独享的对象
- 每个Thread内有自己的实例副本,不共享。
(1)SimpleDateFormat的进化之路
自己写一个类,实现两个线程分别打印出时间信息。
public class ThreadLocalNormalUsage00 {
public String date(int seconds){
//Date()参数单位是毫秒,从1970.1.1 00:00:00 计时
Date date = new Date(1000 * seconds);
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
return dateFormat.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();
}
}
如果需要写100个呢?那就要在代码中写100个线程和100个SimpleDateFormat,写法不优雅。
public static void main(String[] args) {
for (int i=0;i<100;i++) {
int finalI = i;
new Thread(new Runnable() {
@Override
public void run() {
String date = new ThreadLocalNormalUsage01().date(finalI);
System.out.println(date);
}
}).start();
}
}
用for循环去写100、1000个,那么就需要100次的创建销毁线程,造成很大的开销。所以此时可以引入线程池。
public static void main(String[] args