|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
java是一种面向对象的编程语言,优点是可移植性比较高,最初设计时就是本着一次编写到处执行设计的。可以开发各种应用程序和游戏,不过速度没有c++快,所以一般是不用java来编写应用程序和电脑游戏。
早在Java1.2推出之时,Java平台中就引进了一个新的撑持:java.lang.ThreadLocal,给我们在编写多线程程序时供应了一种新的选择。利用这个工具类能够很简便地编写出幽美的多线程程序,固然ThreadLocal十分有效,可是仿佛如今懂得它、利用它的伴侣还未几。
ThreadLocal是甚么
ThreadLocal是甚么呢?实在ThreadLocal并不是是一个线程的当地完成版本,它并非一个Thread,而是threadlocalvariable(线程部分变量)。大概把它定名为ThreadLocalVar加倍符合。线程部分变量(ThreadLocal)实在的服从十分复杂,就是为每个利用该变量的线程都供应一个变量值的正本,是每个线程都能够自力地改动本人的正本,而不会和别的线程的正本抵触。从线程的角度看,就仿佛每个线程都完整具有该变量。线程部分变量并非Java的新创造,在别的的一些言语编译器完成(如IBMXLFORTRAN)中,它在言语的条理供应了间接的撑持。由于Java中没有供应在言语条理的间接撑持,而是供应了一个ThreadLocal的类来供应撑持,以是,在Java中编写线程部分变量的代码绝对对照愚笨,这大概是线程部分变量没有在Java中失掉很好的提高的一个缘故原由吧。
ThreadLocal的计划
起首看看ThreadLocal的接口:
Objectget();//前往以后线程的线程部分变量正本protectedObjectinitialValue();//前往该线程部分变量确当前列程的初始值voidset(Objectvalue);//设置以后线程的线程部分变量正本的值
ThreadLocal有3个办法,个中值得注重的是initialValue(),该办法是一个protected的办法,明显是为了子类重写而特地完成的。该办法前往以后线程在该线程部分变量的初始值,这个办法是一个提早挪用办法,在一个线程第1次挪用get()大概set(Object)时才实行,而且仅实行1次。ThreadLocal中切实其实实完成间接前往一个null:
protectedObjectinitialValue(){returnnull;}
ThreadLocal是怎样做到为每个线程保护变量的正本的呢?实在完成的思绪很复杂,在ThreadLocal类中有一个Map,用于存储每个线程的变量的正本。好比上面的示例完成:
publicclassThreadLocal
{
privateMapvalues=Collections.synchronizedMap(newHashMap());
publicObjectget()
{
ThreadcurThread=Thread.currentThread();
Objecto=values.get(curThread);
if(o==null&&!values.containsKey(curThread))
{
o=initialValue();
values.put(curThread,o);
}
returno;
}
publicvoidset(ObjectnewValue)
{
values.put(Thread.currentThread(),newValue);
}
publicObjectinitialValue()
{
returnnull;
}
}
固然,这并非一个产业强度的完成,但JDK中的ThreadLocal的完成整体思绪也相似于此。
<p>
诸如RMI,EJB等一些技术并不是你说的那么复杂,而是它们把一些复杂的工具封装成不复杂的工具了,理解这些工具是需要些时间。我问你,.net网页编程里有这些工具吗?要简单多少?。 |
|