最近在学习ThreadLocal,顺手编了个测试程序,但是总报错
报错信息:
Exception in thread "Thread-0" java.lang.NullPointerException
at com.thread.Warehouse.get(Warehouse.java:20)
at com.thread.Worker.run(Worker.java:31)
Exception in thread "Thread-1" java.lang.NullPointerException
at com.thread.Warehouse.get(Warehouse.java:20)
at com.thread.Worker.run(Worker.java:31)
这个类相当于一个仓库 每个线程都有独立的List用来存储字符串
public class Warehouse {
private ThreadLocal<List<String>> store = new ThreadLocal<List<String>>();
public void put(String s){
List<String> list = store.get();
if(list == null){
list = new LinkedList<String>();
}
list.add(s);
System.out.println(Thread.currentThread().getName() + "放入: " + s);
}
public void get(){
List<String> list = store.get();
System.out.println(Thread.currentThread().getName() + ": " + list.size());
// if(list != null){
// for(String temp : list){
// System.out.println(temp);
// }
// }else{
// System.err.println("ERROR!");
// }
}
}
这个是线程类 用来存储数据 并打印出存储大小
public class Worker extends Thread {
private int size;
private int count;
private Warehouse warehouse;
public Worker(Warehouse warehouse, int size, int count){
this.warehouse = warehouse;
this.size = size;
this.count = count;
}
//生成随机字符串
public String getRandomString(){
char[] c = { '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', 'q',
'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', 'a', 's', 'd',
'f', 'g', 'h', 'j', 'k', 'l', 'z', 'x', 'c', 'v', 'b', 'n', 'm' };
Random random = new Random();
StringBuilder builder = new StringBuilder();
for(int i=0; i<size; i++){
builder.append(c[random.nextInt(c.length)]);
}
return builder.toString();
}
public void run() {
for(int i=0; i<count; i++){
String temp = getRandomString();
warehouse.put(temp);
}
warehouse.get();
}
}
这个是主函数
public class Main {
public static void main(String[] args) {
Warehouse warehouse = new Warehouse();
Worker worker1 = new Worker(warehouse, 3, 4);
Worker worker2 = new Worker(warehouse, 5, 6);
worker1.start();
worker2.start();
}
}
报错地方在Warehouse类的get方法下的“System.out.println(Thread.currentThread().getName() + ": " + list.size());”,报的空指针异常,但我在线程类中都是先做的put操作再进行的get操作,也就是说,在get操作之前,应该已经完成初始化工作,不应该再报空指针异常。
请劳烦指点一下 我的错误在哪里。 谢谢!