关于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 用来维护对象TestIprivate 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;@Overridepublic 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天了。。。

解决方案

你没有理解ThreadLocal的含义....ThreadLocal是针对本线程进行设置和读取, 你下面这个是在main所在线程里设置的... TestI testI = new TestI(); //创建一个ThreadLocal来维护这个对象 LocalObject localObject = new LocalObject(); localObject.addTestI(testI); 当然只能从main所在的线程里读取了.你启动的TestThread线程里, 根本就没有设置过, 怎么可能读取到呢?
解决方案二:
threadlocal里面存的东西,就是自己线程的一个副本。用以隔离线程之间的相互影响,这么传是传不进去的。
解决方案三:
public class Test2 { 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(); } */ //一个公共的对象 for(int i=0;i<10 ;i++){ new Thread(new TestThread(),"this is thread:"+i).start(); } } } class LocalObject{ //创建一个ThreadLocal 用来维护对象TestI public 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 int i=10; @Override public void run() { TestI testI = new TestI(); //创建一个ThreadLocal来维护这个对象 LocalObject localObject = new LocalObject(); localObject.addTestI(testI); while(localObject.getTestI().getI()>0){ localObject.doSomeThing(); i--; if(localObject.getTestI().getI()!=i){ System.out.println(Thread.currentThread().getName()+"not matched"); } // System.out.println(Thread.currentThread().getName()+"::"+LocalObject.getTestI().getI()); } } } class TestI { public int i=10; public void setI(){ this.i--; } public int getI(){ return this.i; } }ThreadLocal<T> 必須在線程裡set他的get才會抓得到,先set在丟進線程是get不到值的。
解决方案四:
没仔细看你的代码,只是提醒一下ThreadLocal 其实只是创建一个id,真正你往ThreadLocal里面set object,这个object其实是存在当前线程的某个map里面,你get的时候也是根据这个id从当前线程里面拿东西。不同的线程是不能共享你放到threadlocal里面的同一对象的,即你一个线程put,另外一个线程get是拿不到东西的。

时间: 2024-11-25 21:02:05

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

哪位大神帮我看下,同样环境下的dante代理,加了一个虚拟ip却无法生效

问题描述 哪位大神帮我看下,同样环境下的dante代理,加了一个虚拟ip却无法生效 最近项目需要用到多ip代理,我在一个双网卡的服务器上的外网网卡上,通过ip addr add 添加了一个子ip,然后通过dante为此ip加了代理,后台sockd进程启动正常,本机telnet 子ip 端口号 正常外域机器ping该服务器正常,telnet失败!代理未生效!服务器的防火墙是关掉的,哪位大神知道原因吗? 解决方案 有人帮忙看下么,自己顶下

keytool-ssl的大神帮我看下这个问题吧

问题描述 ssl的大神帮我看下这个问题吧 公司的有一个服务器 一个客户端通过ssl加密连接,服务器是C写的,现在又用java写了一个,把C的放弃,由于客户端都在外面,所以客户端的证书没有办法修改(客户端有一个truststore文件),我现在从C的服务器上拿到了两个pem 文件(ca.pem,server.pem),这应该是用openssl生成的,我用keytool生成的keystore文件,在tomcat下的server.xml 里面配置下keystoreFile就可以使用了,我把这两个文件路

懂webservice和ssl的大神帮我看下这个问题吧,谢谢

问题描述 懂webservice和ssl的大神帮我看下这个问题吧,谢谢 ssl单向认证,1.浏览器访问的时候不需要客户端证书,客户端访问webservice时 则需要一个客户端信任列表文件(client.truststore).浏览器访问时 是自动获取的这个证书 还是浏览器有什么特殊机制? 2.client.truststore这个信任证书是由一个服务器证书导入并生成的,能不能再导入其他的服务器证书? 解决方案 浏览器会告诉你 这个证书不安全,但是程序访问的时候会报错,因为代码默认实现的是验证证

解密-关于RSA非对称加密的问题。请各位大神帮我看下以下问题,新人求助。。。感激不尽

问题描述 关于RSA非对称加密的问题.请各位大神帮我看下以下问题,新人求助...感激不尽 关于RSA非对称加密的问题.编程语言采用的是C++ 现在需要设计一个用来加密解密程序.里面包含两个接口,一个是加密,一个是解密. rsa 对称加密是公钥和私钥进行加密,接口设计如下: int EncodeRSA(unsigned char pub_key,unsigned int pass_len, unsigned char data,unsigned int data_len,unsigned char

求助大神帮我看下 下面的代码哪里有错 编译的时候一直报错

问题描述 求助大神帮我看下 下面的代码哪里有错 编译的时候一直报错 #include #include #pragma comment(lib, "Rasapi32.lib") //#include "Resource.h" HRASCONN hrasconn = NULL; //存放活动连接句柄, 用于断开连接 //BOOL WINAPI DlgProc(HWND,UINT,WPARAM,LPARAM); //BOOL RasEnum(HWND hwnd); //

点击事件-求大神帮我看下Fragment的问题

问题描述 求大神帮我看下Fragment的问题 问题是这样的我在一个FragmentA中点击listview的一个item跳到FragmentB中(replace方法),在B中的布局中点击仍然可以相应FragmentA中listview中的点击事件是什么情况?急急急 解决方案 哥们你这描述的太模糊了,贴代码上来看看. 解决方案二: 找到了,是布局的问题正在改中,谢谢哈

线程-请大神帮我看下这部分代码怎么写?谢谢!很急

问题描述 请大神帮我看下这部分代码怎么写?谢谢!很急 如图所示,我把基本通讯功能已经实现,但是我想实现下图中红色圈中部分的功能,自动发送跟数据格式的功能怎么实现啊,希望发送端跟接收端都可以实现这个数据格式的功能,谢谢 整体代码如下: using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System; using System.Data; usin

int-求大神 帮我看下这个存储过程哪里错了

问题描述 求大神 帮我看下这个存储过程哪里错了 DROP PROCEDURE IF EXISTS Query_Role_PhoneRecord;DELIMITER ;;CREATE DEFINER=root@% PROCEDURE Query_Role_PhoneRecord( in userId binary(16)in pagNo intin pagSize int )BEGINdeclare bSize int; set bSize=(pagNo-1)*pagSize;if(bSize<0

ajax-求大神帮我看下为啥这段代码一直走error?

问题描述 求大神帮我看下为啥这段代码一直走error? 解决方案 跨域的服务器进行跨域支持了吗? 120.27.130.65这个服务器要支持你的跨域,才能使用jsonp,否则将不能回调到success函数. 跨域的本质是利用script,img等支持跨域的标签来对非同域名的链接来进行访问. 所以如果想要跨域成功,那么需要在调用方支持跨域. 我自己负责的很多项目跨域是自己写的实现,所以调用跨域的方法都得使用我封装的形式,否则默认是支持不了跨域的. jQuery的jsonp也一样,没有服务器是天然支