blackartanan 2011-05-24 09:43
浏览 240
已采纳

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

 

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

  • 写回答

1条回答 默认 最新

  • fmjsjx 2011-05-24 10:27
    关注

    [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]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 opencv 无法读取视频
  • ¥15 用matlab 实现通信仿真
  • ¥15 按键修改电子时钟,C51单片机
  • ¥60 Java中实现如何实现张量类,并用于图像处理(不运用其他科学计算库和图像处理库))
  • ¥20 5037端口被adb自己占了
  • ¥15 python:excel数据写入多个对应word文档
  • ¥60 全一数分解素因子和素数循环节位数
  • ¥15 ffmpeg如何安装到虚拟环境
  • ¥188 寻找能做王者评分提取的
  • ¥15 matlab用simulink求解一个二阶微分方程,要求截图