线程 ThreadLocal

最近在学习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操作之前,应该已经完成初始化工作,不应该再报空指针异常。

 

请劳烦指点一下 我的错误在哪里。 谢谢!

[quote]
[code="java"]
public void put(String s){

List list = store.get();

if(list == null){

list = new LinkedList();

}

list.add(s);

System.out.println(Thread.currentThread().getName() + "放入: " + s);

}

[/code]
[/quote]
这段代码没有将list set到ThreadLocal里去,在打印前加入这行代码:
[code="java"]
store.set(list);
[/code]