一.

Java 获取线程池 任务数量 java获取线程名称_java

Java 获取线程池 任务数量 java获取线程名称_类对象_02

Java 获取线程池 任务数量 java获取线程名称_类对象_03

不同的运行,导致over的位置发生了变化。为什么呢?我们这里至少有三个线程。三个线程之间来回随机切换。

接下来我们想知道的问题就是,我们开启了多个线程,怎么区分现在正在运行的线程是谁?多个线程随机切换,我们怎么区分。

区分的方法到哪儿找?到thread类中去寻找。线程怎么区分,线程自己最清楚。

Java 获取线程池 任务数量 java获取线程名称_类对象_04

Thread构造函数里面有一个name,线程有名字。

 

Java 获取线程池 任务数量 java获取线程名称_主线程_05

还有getName获取名字。现在,我们就来获取线程的名字(通过名字来区分线程)。(在上面的例子中,我们没有对线程进行构造函数初始化,直接获取名字会是什么样的呢?)

Java 获取线程池 任务数量 java获取线程名称_操作系统_06

d1和d2两个线程在哪儿执行的呢?应该都在run方法里执行,

Java 获取线程池 任务数量 java获取线程名称_操作系统_07

在run方法执行的时候,输出语句中添加了获取名称的语句。(Demo是thread的子类,它也就具备父类的方法,来个getName是可以的)

Java 获取线程池 任务数量 java获取线程名称_java_08

运行之后,确实出现了名称。名称就是thread- 加上编号,从0开始编,这个就是线程的名字(说成默认的线程名字比较好),你要是开启多个的话,就从0开始一直往后遍。(这里DOS中显示的被编号的线程是自己创建的线程吧?)

Java 获取线程池 任务数量 java获取线程名称_Java 获取线程池 任务数量_09

这个编号的出现可能是谁先调用了getName方法,就现在这里出现编号,按照调用的顺序来的。

现在修改程序,将start方法又改回了run方法,

Java 获取线程池 任务数量 java获取线程名称_类对象_10

(我觉着这个run的还是主线程操控的,不会有编号的出现。)

d1是主线程执行的,而且d1调用的run方法,也是主线程来执行的,就看主线程在执行run中getName方法时,输出的线程编码是什么?

编译运行的结果如下:

Java 获取线程池 任务数量 java获取线程名称_操作系统_11

结果显示d1的仍旧是thread-0,但由于是主线程执行的,导致旺财输出是全面而又严谨的。(为什么是thread-0,而不是main?主线程调用run方法,输出了d1线程的名称,不是输出自己的名称)

现在将两个对象d1和d2全部改为run方法,

Java 获取线程池 任务数量 java获取线程名称_java_12

Java 获取线程池 任务数量 java获取线程名称_操作系统_13

这回编码依旧没变,但是全部的代码都是主线程执行的,顺序很严谨。

给大家解释一下,当我们创建两个线程子类对象的时候,它们在创建的同时已经完成了名称的定义。

每一个thread子类对象在创建的当时,就已经有了名称了。但是,我们现在想要知道的是,正在运行的线程的名称是什么?

对于下图的程序,由于子类对象调用的是run方法,所以自己创建的两个线程并没有开启,都是主线程在运行。现在想知道主线程的名字。

Java 获取线程池 任务数量 java获取线程名称_主线程_14

怎么获取当前运行线程的名字呢?(为什么要纠结线程的名字呢?仅仅是为了区分多个线程么?)

继承体系中的getName是获取对象的名字。→不对,获取的是自己创建线程的名称。对象的名称是构造初始化,传递实参得来的。

想要获取运行时线程名称,必须先要得到运行时线程对象(这里的线程对象和继承thread子类对象是不一样的),

在线程类方法当中有一个方法,叫做currentThread(),返回thread类型,静态的,类名可以直接调用。

Java 获取线程池 任务数量 java获取线程名称_操作系统_15

接着对原先的程序进行修改,如下图所示

Java 获取线程池 任务数量 java获取线程名称_java_16

Thread.currentThread().getName(),这样写语法是可以理解的,唯一让我疑惑的是,为什么是类名调用时,采用的Thread类,而不是Demo类?

Java 获取线程池 任务数量 java获取线程名称_类对象_17

当然编译的结果显示,线程名称就是main

Java 获取线程池 任务数量 java获取线程名称_主线程_18

再次修改程序,

Java 获取线程池 任务数量 java获取线程名称_类对象_19

Java 获取线程池 任务数量 java获取线程名称_java_20

DOS结果显示为三种线程的名称。

接着提高获取线程名称方法的可读性,复写该方法。

 

Java 获取线程池 任务数量 java获取线程名称_类对象_21

(这里在构造函数中输入实参,怎么就改变了获取线程名方法的内容呢?)

在run方法的输出中是由name的,也有getName方法?

Java 获取线程池 任务数量 java获取线程名称_操作系统_22

Java 获取线程池 任务数量 java获取线程名称_java_23

DOS的结果中,null和线程名称xiaoqiang,旺财怎么来的?这个流程不是很清楚。