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 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python
  • ¥15 要给毕业设计添加扫码登录的功能!!有偿
  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥15 stable diffusion
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘