zhanghaj011 2014-03-24 16:37
浏览 301
已采纳

关于ThreadLocal的一个测试 大神 帮我看下 为什么run方法里面找不到对象 (为了方便 我把他们都写到一个类中)

直接贴代码了

package test;

public class TestThreadLocal {


    public static void main(String[] args) {

    /*ExecutorService exce = Executors.newCachedThreadPool();

      for(int i=0;i<10;i++){
          
          exce.execute(new Thread(new TestThread(),"this is thread:"+i));
      }
        exce.shutdown();
    }
    */
        //一个公共的对象
        
        TestI testI = new TestI();
        //创建一个ThreadLocal来维护这个对象
        LocalObject localObject = new LocalObject();

        localObject.addTestI(testI);

        //      System.out.println(localObject.getTestI().getI());

        for(int i=0;i<10 ;i++){

            new Thread(new TestThread(localObject),"this is thread:"+i).start(); 

        }

    }
}

class LocalObject{

    //创建一个ThreadLocal 用来维护对象TestI
    private   ThreadLocal<TestI> testIocal = new ThreadLocal<TestI>();


    public  void addTestI(TestI testI){

        testIocal.set(testI);

    }
    public  TestI getTestI(){

        return testIocal.get();
        
    }

    public  void doSomeThing(){

        getTestI().setI();
    }
}


class TestThread implements Runnable{

    private  LocalObject localObject ;

    public TestThread(LocalObject localObject){

        this.localObject = localObject;
        
    }
    private int i=10;
    
    @Override
    public void run() {

        
        while(this.localObject.getTestI().getI()>0){
            
            this.localObject.doSomeThing();
            
            i--;
            
            if(this.localObject.getTestI().getI()!=i){

                System.out.println(Thread.currentThread().getName()+"not matched");
            }
            //  System.out.println(Thread.currentThread().getName()+"::"+LocalObject.getTestI().getI());
        }
    }

}

class TestI  {

    
    private int i=10;
    
    public void setI(){
        
        i--;        
    }
    public int   getI(){
        
        return i;
    }
    
    
}

 报错是Exception in thread "this is thread:1" java.lang.NullPointerException
    at test.TestThread.run(TestThreadLocal.java:75)

 

就是run方法里面找不到对象,但是我通过构造方法注入了一个对象了呀。怎么回事 搞了2天了。。。

  • 写回答

4条回答 默认 最新

  • jimmee 2014-03-24 17:50
    关注

    你没有理解ThreadLocal的含义....

    ThreadLocal是针对本线程进行设置和读取, 你下面这个是在main所在线程里设置的...

         TestI testI = new TestI();  
        //创建一个ThreadLocal来维护这个对象  
        LocalObject localObject = new LocalObject();  
    
        localObject.addTestI(testI);  
    

    当然只能从main所在的线程里读取了.

    你启动的TestThread线程里, 根本就没有设置过, 怎么可能读取到呢?

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 交替优化波束形成和ris反射角使保密速率最大化
  • ¥15 树莓派与pix飞控通信
  • ¥15 自动转发微信群信息到另外一个微信群
  • ¥15 outlook无法配置成功
  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程