看JDK源码,解疑惑
从SUN公司主页上搞下来JDK5.0的源码,可以好好研究了。开始吧。
1、Java定时器原理是怎么样的?
解包jdk_sec-1_5_0-src-jrl,在/j2se/src/share/classes/java/util中找到Timer类。
-
privateTaskQueuequeue=newTaskQueue();
-
-
privateTimerThreadthread=newTimerThread(queue);
我们找到了一个Timer的任务队列,找到了一个实际运行的线程类。
再来看看还有什么:
-
privatevoidmainLoop(){
-
while(true){
-
try{
- TimerTasktask;
- booleantaskFired;
- synchronized(queue){
-
while(queue.isEmpty()&&newTasksMayBeScheduled)
- queue.wait();
-
if(queue.isEmpty())
-
break;
-
-
longcurrentTime,executionTime;
- task=queue.getMin();
-
synchronized(task.lock){
-
if(task.state==TimerTask.CANCELLED){
- queue.removeMin();
-
continue;
- }
- currentTime=System.currentTimeMillis();
- executionTime=task.nextExecutionTime;
-
if(taskFired=(executionTime<=currentTime)){
-
if(task.period==0){
- queue.removeMin();
- task.state=TimerTask.EXECUTED;
-
}else{
- queue.rescheduleMin(
- task.period<0?currentTime-task.period
- :executionTime+task.period);
- }
- }
- }
-
if(!taskFired)
- queue.wait(executionTime-currentTime);
- }
-
if(taskFired)
- task.run();
-
}catch(InterruptedExceptione){
- }
- }
- }
这是最核心的死循环方法,可以看见,在循环中通过不断地获取系统时间,直到特定时间到达。
-------------------------------------------------------我是无聊的分割线-------------------------------------------------------------------
2、String类型实际是怎么实现的。
-
-
privatefinalcharvalue[];
-
-
-
privatefinalintoffset;
-
-
-
privatefinalintcount;
-
-
-
privateinthash;
看到了一个char类型数组,它才是实现String的根本,还有几个辅助属性。值得注意的是,String内容实际是不可变的,举例:
-
publicStringconcat(Stringstr){
-
intotherLen=str.length();
-
if(otherLen==0){
-
returnthis;
- }
-
charbuf[]=newchar[count+otherLen];
- getChars(0,count,buf,0);
- str.getChars(0,otherLen,buf,count);
-
returnnewString(0,count+otherLen,buf);
- }
这是其中的一个字符串连接的方法,可以看到String所有的方法,只要是牵涉到对字符串更改的,一律调用构造器生成一个新的返回,而根本不更改本身的内容,不过StringBuffer的内容却是可变的,看源码便知。
-------------------------------------------------------我是可爱的分割线-------------------------------------------------------------------
3、关于Thread。
我们都知道Thread实现了Runnable接口。不过现在我们看看里面的一个有趣的方法:
-
publicstaticvoidsleep(longmillis,intnanos)
- throwsInterruptedException{
-
if(millis<0){
-
thrownewIllegalArgumentException("timeoutvalueisnegative");
- }
-
-
if(nanos<0||nanos>999999){
-
thrownewIllegalArgumentException(
-
"nanosecondtimeoutvalueoutofrange");
- }
-
-
if(nanos>=500000||(nanos!=0&&millis==0)){
- millis++;
- }
-
- sleep(millis);
- }
看到了吧,纳秒——根本就是假的,我们都被JDK骗了。Java常规控制线程的时间精度是非常低的,根本不可能接近纳秒的级别,至于你传入的纳秒参数,下场就是要么变成0,要么变成1毫秒。
-------------------------------------------------------我是傻帽的分割线-------------------------------------------------------------------
4、容器类的容量变化的实现:
以Vector为例吧,找到了一个需要变化容量的方法:
-
protectedObject[]elementData;
-
-
privatevoidensureCapacityHelper(intminCapacity){
-
intoldCapacity=elementData.length;
-
if(minCapacity>oldCapacity){
- Object[]oldData=elementData;
-
intnewCapacity=(capacityIncrement>0)?
- (oldCapacity+capacityIncrement):(oldCapacity*2);
-
if(newCapacity<minCapacity){
- newCapacity=minCapacity;
- }
-
elementData=newObject[newCapacity];
- System.arraycopy(oldData,0,elementData,0,elementCount);
- }
- }
可以看到它的容器大小增长策略,如果有合理的增量,当然听用户的,否则简单地乘2完事。
这只是随便挑了几个JDK的类看一看而已,相信进一步的研究会有更多收获。
分享到:
相关推荐
10. **社区交流**:参与易语言的开发者社区,可以获取最新的技术资讯,交流编程心得,寻求帮助和解答疑惑,进一步提升编程技能。 综上所述,"易语言源码winsys.7z"包含了许多关于易语言编程、Windows系统编程以及...
最近在学习C++基础部分,看了两天书,已经看过了一遍,半知半解,回过头来重新看第二遍,深入了解一下C++的基础知识。现在读到了const关键字的用法,书上面讲解的时候并没有给出完整的实例,只是理论的讲解了一些...
MyBatis是一个轻量级的持久层框架,它简化了SQL操作,将SQL语句与Java代码解耦合。在学生在线学习平台中,MyBatis用于数据库访问,通过XML或注解方式定义SQL语句,实现了数据的增删改查操作。 **5. 学生在线学习...
"Awaker",唤醒者,寓意着这款应用能够唤醒用户的阅读兴趣,提供丰富的文章内容,帮助用户探索未知,解答疑惑。从这个命名中,我们可以感受到开发者对用户体验的关注和对知识传播的热情。 作为一款开源项目,Awaker...
学习Iocomp.Net的使用,除了参考DEMO代码,还可以查阅官方文档、在线教程以及社区论坛,获取更多实践案例和解答疑惑。 总结,"Iocomp.Net在C#下使用的DEMO"是一个很好的学习资源,它通过具体的实例演示了如何在C#...
对于依赖的jar包,你可能疑惑应将它们放在何处,是源码库还是项目内?频繁地复制jar包到不同的项目中,这样的做法是否合理?如果你开发的通用组件被多个项目使用,通过邮件分发更新的jar包显然不是一种高效的方法。...
2. **获取源码**:从GitHub或其他版本控制系统克隆或下载Tidels项目的源码,如tidels-master文件。 3. **解压与初始化**:解压缩下载的文件,并在命令行工具中进入项目目录,使用`npm init`命令初始化项目。 4. **...
你难免会遇到各种各样的问题,有些可能让你百思不得其解,甚至翻遍图书馆,也找不到问题的答案。 《你必须知道的495个C语言问题》的出版填补了这一空白。许多知识点的阐述都是其他资料中所没有的,弥足珍贵。 涵盖...