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 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler
  • ¥15 关于#python#的问题:自动化测试