创建线程集中方式?
l 继承Thread
l 实现Runnable
两个工具辅助创建线程,控制线程的执行
l 线程池
l Callable/Future
ThreadLocal
辅助一个线程持有自己的数据,这个数据与其他线程不共享
把数据绑定到线程,线程当做一条流水线,来传递数据
l 多线程并行时,数据是安全的
threadLocal = new ThreadLocal();
// 在当前线程上绑定数据
threadLocal.set(2.744625);
// 从当前线程获取绑定的数据
threadLocal.get()
// 从当前线程删除数据
threadLocal.remove()
l 存储结构
–线程中封装一个 Map
–用ThreadLocal实例作为键
–对应的值是绑定的数据
public class TestThreadLocal {
static ThreadLocal<Double> threadLocal = new ThreadLocal<Double>();
public static void main(String[] args) {
new Thread() {
public void run() {
a();
b();
c();
clearData();
}
}.start();
new Thread() {
public void run() {
c();
a();
b();
clearData();
}
}.start();
}
static void a() {
String n = Thread.currentThread().getName();
Double d = data();
System.out.println(n+" - "+d);
}
static void b() {
String n = Thread.currentThread().getName();
Double d = data();
System.out.println(n+" - "+d);
}
static void c() {
String n = Thread.currentThread().getName();
Double d = data();
System.out.println(n+" - "+d);
}
/**
* 获取线程上的数据,如果没有,则添加数据
* @return
*/
static Double data() {
Double d = threadLocal.get();
if (d == null) {
d = Math.random();
threadLocal.set(d);
}
return d;
}
/**
* 清除数据
*/
static void clearData() {
threadLocal.remove();
}
}
执行结果
Thread-1 - 0.029967069976274407
Thread-1 - 0.029967069976274407
Thread-1 - 0.029967069976274407
Thread-0 - 0.5485232310197068
Thread-0 - 0.5485232310197068
Thread-0 - 0.5485232310197068