前几天遇到一个关于java线程的疑惑,一直没有得到解答,甚至最后我认为这应该算是jdk的一个BUG,于是自不量力的提交了一个BUG到oracle官方,至今没有任何回复呢。
背景:
我做了一个定时下载某个网站图片的应用服务。
当时的想法很简单,因为每隔5分钟下载一次,一次可能需要下载多张,每个图片开一个线程去下载,并行下载完毕后线程就自动关闭了。5分钟后再开新的线程去下载,如此一直运行.......
问题:
按照上面的方法可以实现所有功能,但是在日志里发现一个很奇怪的问题,就是线程ID一直增加,没有减少,查阅了一下API里关于Thread的解释,里面是这样说的:
public long getId()
返回该线程的标识符。线程 ID 是一个正的 long 数,在创建该线程时生成。
线程 ID 是唯一的,并终生不变。
线程终止时,该线程 ID 可以被重新使用。
也就是说,线程Id应该是可以被回收的,一直增加是有问题的。
我尝试了好多方法验证,最终发现Id还是没有被重复利用,于是对API产生了一些怀疑,到官方在线查看英文的API是这样说的:
public long getId()
Returns the identifier of this Thread. The thread ID is a positive long number generated when this thread was created. The thread ID is unique and remains unchanged during its lifetime.
When a thread is terminated, this thread ID may be reused.
英文原版API的说法是 this thread ID may be reused. 我英语水平不是很好,may be确实可以翻译成“可以”,但是貌似不是很确定,人家的意思可能是:有可能被重复利用,也有可能不被重复利用。
我想这也是为什么提交bug到oracle没人理我的原因吧。
接下来看看jdk里关于Thread的实现(1.6版本):
http://aiiuui.com/code/read.jsp?file=%252Fjava6.0%25E6%25BA%2590%25E7%25A0%2581%252Fjava%252Flang%252FThread.java
访问上面的连接 查找线程id的定义: private long tid;
接着 查找 tid 的初始化 : tid = nextThreadID();
接下来查看初始化方法nextThreadID() 的实现:
private static synchronized long nextThreadID() {
return ++threadSeqNumber;
}
我们看到这里返回的Id只有增加,没有任何其他处理。
我们可以继续搜索对于 threadSeqNumber 的处理,看看是否有回收的处理:
最终发现只有一处定义,其他地方在没有处理 private static long threadSeqNumber;
至此,我明白为什么Thread的id只增加不减少了,但是我认为这个是不合理的,也是与API不符的,所以我斗胆提交了一个bug到oracle,至今无回应,哎。
本人做开发时间不久,被这个问题困扰很久,写出来希望得到大家的帮助。
分享到:
相关推荐
ORACLE_DBA必备技能详解 --个人认为这是一本初级DBA很值得一看的书 (最近积分严重不够用,小的斗胆挂个三分,诸君见谅 ^_^)
斗胆灯,作为一种高效节能的照明设备,以其卓越的性能和广泛的应用范围,越来越受到市场的青睐。本文将深入解析一款1X20W斗胆灯的产品规格书,从产品描述、特性、技术参数、可靠性测试以及安装方式等方面进行全面...
斗胆同学.py(用Python打印的一首恶搞诗)
斗胆灯产品规格书模板.pdf
近期恰逢好友孙继伟教授邀请我参加一个活动,分享这个话题的个人看法,虽明知力有不逮,但也斗胆一试。能力有限,错误难免,欢迎大家拍砖。我计划从如下几个问题来展开说明。 2、什么是ChatGPT? 从目前来看,...
一个人的才智也太有限了,如果这个小生命在我一个人的手里,也许会因为得不到充足的阳光雨露而不能茁壮成长,但是如果有您的加入,多了您的呵护,相信我们的目标才更有可能实现。如果您是高手,那么就在这里表现您的...
一个人的才智也太有限了,如果这个小生命在我一个人的手里,也许会因为得不到充足的阳光雨露而不能茁壮成长,但是如果有您的加入,多了您的呵护,相信我们的目标才更有可能实现。如果您是高手,那么就在这里表现您的...
一个人的才智也太有限了,如果这个小生命在我一个人的手里,也许会因为得不到充足的阳光雨露而不能茁壮成长,但是如果有您的加入,多了您的呵护,相信我们的目标才更有可能实现。如果您是高手,那么就在这里表现您的...
2.将zfind.exe放到环境变量Path中任意一个路径下,一般情况下直接放到C:/windows/system32即可。 3.进入cmd命令行,并进入想要搜索的目录。比如,我的C++源文件全部在D:/src,那么CD到这个目录下,直接使用zfind ...
- 修辞和敬辞的使用(21题),涉及到日常交际中的礼貌用语,如“斗胆”“托福”“斧正”等,这些都是语文学习中的基础文化知识。 总的来说,这份高三语文期中试题涵盖了语言理解、文本分析、文学鉴赏、历史知识、...
我很[高兴/担心]了解到 [具体情况]。我写信是为了就[讨论主题]提出我的建议/提案/看法。我认为[第一点观点]。一方面,[支持第一点的理由]。另一方面,[另一点观点]。关于[具体问题],我建议[具体建议一],因为[解释...
2022,我听到最多的一个词,就是“不确定性”。 市场有不确定性。供应链有不确定性。疫情有不确定性。国际环境有不确定性。2022,似乎到处都是不确定性。今天的年度演讲,我就斗胆和你聊聊“不确定性”。 当整个...
【黄石三中上学期期中考试.doc】是一份高二语文试卷,主要涉及语文基础知识的考核,包括字音、字形、词语运用、病句辨析、诗词理解等多个方面。以下是对这些知识点的详细说明: 1. 字音:试题中考察了汉字的正确...
3. 文学文化常识:《诗经》的“六艺”、《国风》与《离骚》的文学地位、《古诗十九首》的性质,以及“风骚”一词的来源和含义,这些是语文学习中的重要文学文化知识,体现了对传统文化的理解和尊重。 4. 借物喻人的...
庆祝新中国成立 60 周年),当然如果哪位兄弟学习能力比较强推荐大名鼎鼎的 ROUTEROS (简称 ROS ), ROS 涉及到写脚本问题,这个不是一两天能够弄明白,毕竟我只是停留在应用层的一个爱好者。废话少说,举个图例 ...
时常看到一些人说掌握了Java,但是让他们用Java做一个实际的项目可能又困难重重,在这里,笔者根据自己的一点理解斗胆提出自己的一些对掌握Java这个说法的标准,当然对于新手,也可以提供一个需要学习哪些内容的参考...
1. **语文试题结构与题型**:高一语文下学期期中质量评估试题涵盖了基础知识、文言文阅读、现代文阅读、诗歌鉴赏、写作等多个部分,全面检验学生对语文知识的掌握程度。这包括字音、字形、成语使用、语法错误辨析、...
这个本版比上一个版本(桌面之星)添加了自动换桌面的功能,壁纸支持BMP,JPG,PNG,GIF. 现在软件的功能包括: 3D桌面宠物 定时提醒 定时关机 动态更换桌面 下一本版将添加从IE上保存到壁纸文件夹的功能,但是主要...
初学数据库,突然有想法开发一个简单的数据库管理系统 开发期间遇到了一些问题 也自己学习了 好多东西 感觉自己动手做一些东西 对程序设计能力确实有很大提升. 小弟刚学java,没到半年,学 access和sql也不到半个月,...