class Account {
/*
* 定义一个ThreadLocal类型的变量,该变量将是一个线程局部变量 每个线程都会保留该变量的一个副本;tl是boolean[]类型,CSDN显示不了!
*/
private ThreadLocal tl = new ThreadLocal();
// 定义一个初始化tl成员变量的构造器
public Account(boolean[] str) {
this.tl.set(str);
// 下面代码用于访问当前线程的tl副本的值
System.out.println("---" + this.tl.get());
// 当前线程的tl副本的值
System.out.println("---" + this.tl.get()[5]);
}
// tl的getter方法
public boolean[] getTl() {
return tl.get();
}
}
class MyTest extends Thread {
// 定义一个Account类型的成员变量
private Account account;
// 定义一个String类型的成员变量
private String carName;
public MyTest(Account account, boolean[] name, String carName) {
super();
System.out.println("new对象:" +account+":"+account.getTl());
this.carName = carName;
this.account = account;
}
public void run() {
// name中boolean[]是否为空
if (account.getTl() == null) {
System.err.println("空异常:" + account+":"+account.getTl());
return;
}
// 循环10次
for (int i = 0; i < account.getTl().length; i++) {
if (account.getTl()[i] == false) {
account.getTl()[i] = true;
// 输出停车信息
System.out.println(carName + " 车主在" + account.getTl() + "找到的停车位是:" + (i + 1));
break;
}
}
}
}
public class ThreadLocalCarStopTest {
public static void main(String[] args) {
// 启动N条线程(即N辆车),N条线程共享同一个Account
boolean[] b = new boolean[10];
Account at = new Account(b);
new MyTest(at, b, "车1").start();
}
}
输出:
---[Z@1db9742
---false
new对象:net.test.Account@106d69c:[Z@1db9742
空异常:net.test.Account@106d69c:null
为什么出现空异常?在new MyTest时不为空,怎么启动线程后就为null?