`

看源码,解疑惑

阅读更多

看JDK源码,解疑惑

 

从SUN公司主页上搞下来JDK5.0的源码,可以好好研究了。开始吧。

 

1、Java定时器原理是怎么样的?

解包jdk_sec-1_5_0-src-jrl,在/j2se/src/share/classes/java/util中找到Timer类。

  1. privateTaskQueuequeue=newTaskQueue();
  2. privateTimerThreadthread=newTimerThread(queue);

我们找到了一个Timer的任务队列,找到了一个实际运行的线程类。

再来看看还有什么:

  1. privatevoidmainLoop(){
  2. while(true){
  3. try{
  4. TimerTasktask;
  5. booleantaskFired;
  6. synchronized(queue){
  7. //Waitforqueuetobecomenon-empty
  8. while(queue.isEmpty()&&newTasksMayBeScheduled)
  9. queue.wait();
  10. if(queue.isEmpty())
  11. break;//Queueisemptyandwillforeverremain;die
  12. //Queuenonempty;lookatfirstevtanddotherightthing
  13. longcurrentTime,executionTime;
  14. task=queue.getMin();
  15. synchronized(task.lock){
  16. if(task.state==TimerTask.CANCELLED){
  17. queue.removeMin();
  18. continue;//Noactionrequired,pollqueueagain
  19. }
  20. currentTime=System.currentTimeMillis();
  21. executionTime=task.nextExecutionTime;
  22. if(taskFired=(executionTime<=currentTime)){
  23. if(task.period==0){//Non-repeating,remove
  24. queue.removeMin();
  25. task.state=TimerTask.EXECUTED;
  26. }else{//Repeatingtask,reschedule
  27. queue.rescheduleMin(
  28. task.period<0?currentTime-task.period
  29. :executionTime+task.period);
  30. }
  31. }
  32. }
  33. if(!taskFired)//Taskhasn'tyetfired;wait
  34. queue.wait(executionTime-currentTime);
  35. }
  36. if(taskFired)//Taskfired;runit,holdingnolocks
  37. task.run();
  38. }catch(InterruptedExceptione){
  39. }
  40. }
  41. }

这是最核心的死循环方法,可以看见,在循环中通过不断地获取系统时间,直到特定时间到达。

-------------------------------------------------------我是无聊的分割线-------------------------------------------------------------------

2、String类型实际是怎么实现的。

  1. /**Thevalueisusedforcharacterstorage.*/
  2. privatefinalcharvalue[];
  3. /**Theoffsetisthefirstindexofthestoragethatisused.*/
  4. privatefinalintoffset;
  5. /**ThecountisthenumberofcharactersintheString.*/
  6. privatefinalintcount;
  7. /**Cachethehashcodeforthestring*/
  8. privateinthash;//Defaultto0

看到了一个char类型数组,它才是实现String的根本,还有几个辅助属性。值得注意的是,String内容实际是不可变的,举例:

  1. publicStringconcat(Stringstr){
  2. intotherLen=str.length();
  3. if(otherLen==0){
  4. returnthis;
  5. }
  6. charbuf[]=newchar[count+otherLen];
  7. getChars(0,count,buf,0);
  8. str.getChars(0,otherLen,buf,count);
  9. returnnewString(0,count+otherLen,buf);
  10. }

这是其中的一个字符串连接的方法,可以看到String所有的方法,只要是牵涉到对字符串更改的,一律调用构造器生成一个新的返回,而根本不更改本身的内容,不过StringBuffer的内容却是可变的,看源码便知。

 

-------------------------------------------------------我是可爱的分割线-------------------------------------------------------------------

 

3、关于Thread。

我们都知道Thread实现了Runnable接口。不过现在我们看看里面的一个有趣的方法:

  1. publicstaticvoidsleep(longmillis,intnanos)
  2. throwsInterruptedException{
  3. if(millis<0){
  4. thrownewIllegalArgumentException("timeoutvalueisnegative");
  5. }
  6. if(nanos<0||nanos>999999){
  7. thrownewIllegalArgumentException(
  8. "nanosecondtimeoutvalueoutofrange");
  9. }
  10. if(nanos>=500000||(nanos!=0&&millis==0)){
  11. millis++;
  12. }
  13. sleep(millis);
  14. }

看到了吧,纳秒——根本就是假的,我们都被JDK骗了。Java常规控制线程的时间精度是非常低的,根本不可能接近纳秒的级别,至于你传入的纳秒参数,下场就是要么变成0,要么变成1毫秒。

 

-------------------------------------------------------我是傻帽的分割线-------------------------------------------------------------------

4、容器类的容量变化的实现:

以Vector为例吧,找到了一个需要变化容量的方法:

  1. //这是它实际存储对象的数组
  2. protectedObject[]elementData;
  3. privatevoidensureCapacityHelper(intminCapacity){
  4. intoldCapacity=elementData.length;
  5. if(minCapacity>oldCapacity){
  6. Object[]oldData=elementData;
  7. intnewCapacity=(capacityIncrement>0)?
  8. (oldCapacity+capacityIncrement):(oldCapacity*2);
  9. if(newCapacity<minCapacity){
  10. newCapacity=minCapacity;
  11. }
  12. elementData=newObject[newCapacity];
  13. System.arraycopy(oldData,0,elementData,0,elementCount);
  14. }
  15. }

可以看到它的容器大小增长策略,如果有合理的增量,当然听用户的,否则简单地乘2完事。

这只是随便挑了几个JDK的类看一看而已,相信进一步的研究会有更多收获。

 

分享到:
评论

相关推荐

    ASP源码解密 破解ASP加密源码

    ASP解密 破解ASP加密源码 ASP解密 破解ASP加密源码

    易语言源码易语言解线性方程组源码.rar

    易语言源码易语言解线性方程组源码.rar 易语言源码易语言解线性方程组源码.rar 易语言源码易语言解线性方程组源码.rar 易语言源码易语言解线性方程组源码.rar 易语言源码易语言解线性方程组源码.rar 易语言源码...

    微信H5问答解谜开源源码

    微信H5问答解谜开源源码是一个用于创建互动问答游戏的软件开发资源,适用于微信环境。这个开源项目意味着它的源代码是公开的,允许开发者查看、学习和修改代码以适应自己的需求。源码已经修复了暗链(Blackchain)...

    易语言7z解压缩源码.7z

    本文将深入探讨“易语言7z解压缩源码”这一主题,包括7z格式、解压缩原理以及易语言在实现解压缩过程中的关键知识点。 7z是一种高效的数据压缩格式,由7-Zip软件创建,它使用了多种压缩算法,如LZMA、PPMd等,以...

    数独破解(源码)

    数独是一种源自18世纪末的瑞士,后在美国发展、并在日本得以发扬光大的数学智力拼图游戏。拼图是九宫格(即3格宽×3格高)的正方形状,每一格又细分为一个...若数独游戏本身非唯一解,则本软件只能帮你找出其中一个解。

    6轴机械手正解,反解算法;vs2017工程,vc编写的源码

    总结来说,这个压缩包提供的6轴机械手正解和反解算法源码,结合VS2017开发环境,为学习者和开发者提供了一个直观且实用的工具,有助于深入理解和掌握机械手运动控制的核心技术。通过实际操作和测试,不仅可以提升...

    (安卓APP项目源代码)文件管理器源码,文件拖曳,list弹性,root ,zip压缩解.zip

    (安卓APP项目源代码)文件管理器源码,文件拖曳,list弹性,root ,zip压缩解.zip(安卓APP项目源代码)文件管理器源码,文件拖曳,list弹性,root ,zip压缩解.zip(安卓APP项目源代码)文件管理器源码,文件拖曳,list弹性,...

    哈夫曼压缩与解压缩源码.zip

    哈夫曼压缩与解压缩源码.zip哈夫曼压缩与解压缩源码.zip哈夫曼压缩与解压缩源码.zip哈夫曼压缩与解压缩源码.zip哈夫曼压缩与解压缩源码.zip哈夫曼压缩与解压缩源码.zip哈夫曼压缩与解压缩源码.zip哈夫曼压缩与解压缩...

    通达信指标公式源码解套神器 分时主图指标.doc

    通达信指标公式源码解套神器 分时主图指标.doc

    影视小程序源码支持Json官解+卡密系统源码.zip

    影视小程序源码/支持Json官解+卡密系统源码 这是一款最新影视小程序,支持官解和卡密系统,也有仿封系统,独立API后台然后对接的苹果cms,亲测可以使用,搭建也比较简单。 运行环境centos7.8+nginx+php7.0

    一款goto在线解源码,PHP源码解密工具

    标题中的"goto在线解源码,PHP源码解密工具"是一款专门针对PHP源码进行解密的在线工具,它允许用户上传加密或混淆过的PHP代码,通过特定算法还原其可读性。下面我们将深入探讨PHP源码加密、混淆以及解密的相关知识点...

    C#源码文件解压缩C#源码文件解压缩C#源码文件解压缩C#源码文件解压缩

    C#源码文件解压缩C#源码文件解压缩C#源码文件解压缩C#源码文件解压缩

    scratch2源码解方程

    scratch2源码解方程本资源系百度网盘分享地址

    rar密码破解源码

    rar 密 码 破 解 源 码

    puma560的运动学正解和逆解的C++源码.cpp

    puma560的运动学正解和逆解的C++源码.cpp puma560的运动学正解和逆解的C++源码.cpp puma560的运动学正解和逆解的C++源码.cpp

    SSCOM源码 DELPHI 源码

    SSCOM源码 DELPHI 源码 绝对源码!欢迎下载

    易语言源码易语言GZIP解压缩源码.rar

    本资源"易语言源码易语言GZIP解压缩源码.rar"显然提供了使用易语言实现GZIP压缩格式解压缩功能的源代码。 GZIP是一种广泛使用的数据压缩格式,主要应用于网络传输,如HTTP、FTP协议中,它可以减小文件的大小,从而...

    FFmpeg解封装并获取本地媒体文件信息的源码

    本资源是博主的博文《FFmpeg解封装并获取本地媒体文件的信息》的源码,博文地址在https://blog.csdn.net/u014552102/article/details/81709929。该资源里面包含整个vs2015的工程,依赖的FFmpeg库,还有演示用的audio...

    通达信指标公式源码 解套王副图指标.doc

    通达信指标公式源码 解套王副图指标.doc

    超级解霸 V2.0 源码

    《超级解霸 V2.0 源码》是一份珍贵的编程资源,它揭示了在90年代末期和2000年初,中国软件业中著名的视频播放器——超级解霸的核心技术。这份源码是理解早期多媒体播放器开发历史、技术实现以及软件工程实践的重要...

Global site tag (gtag.js) - Google Analytics