• 线程的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是最低的应该最后才执行。

results matching ""

    No results matching ""