最近在学习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操作之前,应该已经完成初始化工作,不应该再报空指针异常。
请劳烦指点一下 我的错误在哪里。 谢谢!