看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的类看一看而已,相信进一步的研究会有更多收获。
分享到:
相关推荐
ASP解密 破解ASP加密源码 ASP解密 破解ASP加密源码
微信H5问答解谜开源源码是一个用于创建互动问答游戏的软件开发资源,适用于微信环境。这个开源项目意味着它的源代码是公开的,允许开发者查看、学习和修改代码以适应自己的需求。源码已经修复了暗链(Blackchain)...
数独是一种源自18世纪末的瑞士,后在美国发展、并在日本得以发扬光大的数学智力拼图游戏。拼图是九宫格(即3格宽×3格高)的正方形状,每一格又细分为一个...若数独游戏本身非唯一解,则本软件只能帮你找出其中一个解。
总结来说,这个压缩包提供的6轴机械手正解和反解算法源码,结合VS2017开发环境,为学习者和开发者提供了一个直观且实用的工具,有助于深入理解和掌握机械手运动控制的核心技术。通过实际操作和测试,不仅可以提升...
(安卓APP项目源代码)文件管理器源码,文件拖曳,list弹性,root ,zip压缩解.zip(安卓APP项目源代码)文件管理器源码,文件拖曳,list弹性,root ,zip压缩解.zip(安卓APP项目源代码)文件管理器源码,文件拖曳,list弹性,...
影视小程序源码/支持Json官解+卡密系统源码 这是一款最新影视小程序,支持官解和卡密系统,也有仿封系统,独立API后台然后对接的苹果cms,亲测可以使用,搭建也比较简单。 运行环境centos7.8+nginx+php7.0
SSCOM源码 DELPHI 源码 绝对源码!欢迎下载
linux 编译解压缩文件用的7Z 源码,
四阶龙格库塔法求解微分方程数值解源码 图像处理Hough霍夫曼直线检测源码 I图像处理直线识别(拟合角平分线) 图像处理螺纹识别源码 基本语法和语句示例练习 夜间车牌识别程序 txt文本数据分离的源码 不同插值方法的...
本资源"易语言源码易语言GZIP解压缩源码.rar"显然提供了使用易语言实现GZIP压缩格式解压缩功能的源代码。 GZIP是一种广泛使用的数据压缩格式,主要应用于网络传输,如HTTP、FTP协议中,它可以减小文件的大小,从而...
本资源是博主的博文《FFmpeg解封装并获取本地媒体文件的信息》的源码,博文地址在https://blog.csdn.net/u014552102/article/details/81709929。该资源里面包含整个vs2015的工程,依赖的FFmpeg库,还有演示用的audio...
《超级解霸 V2.0 源码》是一份珍贵的编程资源,它揭示了在90年代末期和2000年初,中国软件业中著名的视频播放器——超级解霸的核心技术。这份源码是理解早期多媒体播放器开发历史、技术实现以及软件工程实践的重要...
搜索引擎聚合源码
安卓app开发项目-文件管理器源码,文件拖曳,list弹性,root ,zip压缩解(源码).zip安卓app开发项目-文件管理器源码,文件拖曳,list弹性,root ,zip压缩解(源码).zip安卓app开发项目-文件管理器源码,文件拖曳,list弹性,...
eterm破解JAVA源码,运用JAVA语言实现登录eterm的思路。欢迎大家下载参考!
易语言源码用求根公式解二元一次方程易语言源码.rar 易语言源码用求根公式解二元一次方程易语言源码.rar 易语言源码用求根公式解二元一次方程易语言源码.rar 易语言源码用求根公式解二元一次方程易语言源码.rar ...
C++实现基于模拟退火算法寻找八幻方问题的解源码.zipC++实现基于模拟退火算法寻找八幻方问题的解源码.zipC++实现基于模拟退火算法寻找八幻方问题的解源码.zipC++实现基于模拟退火算法寻找八幻方问题的解源码.zipC++...
wifi802.11解交织C语言源码,代码里有数据,可直接跑,主要是对数据进行解交织操作。不喜勿喷,谢谢
易语言源码数据的封包与解包的过程易语言源码.rar 易语言源码数据的封包与解包的过程易语言源码.rar 易语言源码数据的封包与解包的过程易语言源码.rar 易语言源码数据的封包与解包的过程易语言源码.rar 易语言...
基于matlab使用龙格库塔法解激光的速率方程项目源码(下载即用),含有代码注释,新手也可看懂,个人手打98分项目,导师非常认可的高分项目,期末大作业和课程设计高分必看,下载下来,简单部署,就可以使用。...