- 线程的ID看起来就是拿一个ID,在你出了问题,线程堆栈的时候,CPU怎么占用那么多?然后你去查的时候,可能在堆栈信息里面就会有这个ID这个东西出来!
- 这个ID就是获取线程的编号, 这个编号里面是什么规则呢?
- 如果没有显示指定名字她会拿默认的名字,默认的名字是从"Thread-"开始自增的一个序列。
- Java线程优先级的范围是1~10,默认的优先级是5。“高优先级线程”会优先于“低优先级线程”执行。
线程ID
创建一个线程t,给他一个Runnable接口,定义名字为t1,Runnable接口打印一句话,然后休眠一下,最后把ID、名字、优先级推导出来!
运行结果:
线程t1的ID为11,优先级是5。
线程的ID是怎么算出来的?
我们看一下源码。
然后找到
nextThreadID
。nextThreadID
又怎么来的?原来是根据
threadSeqNumber
做++的也就是说我们在创建线程之前JVM已经创建9个线程了。
RMI TCP 开头的是启动JConsole后面创建的.
一共有11个线程,这是他的线程ID。
线程ID在你打线程堆栈时,你服务器上没有这样的工具时会比较有用。
优先级
通过优先级可以企图改变线程执行的优先顺序,但是不一定会按照你的期望去执行,所以说不要试图控制线程的优先级去执行。(先执行某某部分再执行某某部分)
比如:线程t1的优先级比较高,是10,然后可能循环了100次 ,里面执行了99次,再轮到别的去执行。(这个概念有点像Windows系统的任务管理器里面进程的优先级)
就像360的进程,有时候你想杀他但又杀不掉,因为他的优先级比较高。
所以我们不要想着让一个线程负责的东西让他多做一些,另外一个让他少做一些,可能优先级比较低分到CPU执行权的概率旧比较低,其实不一定会是这样子的。
- 可以通过其他的程序逻辑去处理,比如可以做一些优先级队列
创建3个线程,分别给一个Runnable接口,定义名字为t1、t2、t3然后分别循环输出线程的
名字+"-index"
1000次。运行结果:
先是t2和t3一直交替去执行,t1是最先定义最先起的,他反倒执行得比较靠后。下次从新运行顺序又会不一样,因为是多线程的,start之后是Runnable状态,不一定是Running状态。
现在来设置一下优先级:
// 最高优先级 10 t1.setPriority(Thread.MAX_PRIORITY); // 标准优先级 5 t2.setPriority(Thread.NORM_PRIORITY); // 最低优先级 1 t3.setPriority(Thread.MIN_PRIORITY);
运行结果:
从运行结果可以看出她并没有控制住,t1是最高的优先执行了,但是t2和t3出现了交替执行的情况,t3是最低的应该最后才执行。