Java可通过Thread的构造方法给当前线程命名。当程序员不为线程命名,线程会自己为他命名。
当Java虚拟运行时,至少会有两个线程,那么这两个线程的名称系统默认是什么呢?
public class Test {
public static void main(String[] args) {
//显示系统给当前线程的命名
method1();
//自己为当前线程命名
method2();
//显示main线程的名称
method3();
//显示垃圾收集器的名称
//method4();
}
/*
* 显示系统给当前线程的命名
*/
public static void method1(){
//通过Thread对象的start()方法调用使当前线程开始运行
new Thread(new Runnable() {
public void run() {
//获得系统为当前线程自动命名的名称
String name = Thread.currentThread().getName();
//显示线程当前的名称
System.out.println("虚拟机为该线程命名的名称为:" + name);
}
}).start();
}
/*
* 自己为当前线程命名
*/
public static void method2(){
Runnable runnable = new Runnable() {
public void run() {
//获得当前线程的名称
String name = Thread.currentThread().getName();
//显示线程当前的名称
System.out.println("虚拟机为该线程命名的名称为:" + name);
}
};
//为当前线程命名并使当前线程开始运行
new Thread(runnable, "线程1").start();
}
/*
* 显示main线程的名称
*/
public static void method3(){
String name = Thread.currentThread().getName();
System.out.println("main线程的名称:" + name);
}
/*
* 显示垃圾收集器的名称
*/
public static void method4(){
//为内存增加对象,以便虚拟机会自动调用垃圾收集器的,垃圾收集器再调用垃圾对象的finalize()方法
for(int i = 0; i < 1000; i++){
new Demo();
}
//调用系统的gc()方法以便提醒虚拟机调用垃圾收集器
System.gc();
}
}
/*
* 重写该类的finalize方法一边垃圾收集器调用该方法时显示垃圾处理器的名称。
*/
class Demo{
private int i = 0;
@Override
protected void finalize() throws Throwable {
super.finalize();
//获得垃圾处理器的线程名称
String name = Thread.currentThread().getName();
System.out.println("垃圾处理器的名称是:" + name);
}
}
程序运行结果是:
method1()、method2()、method3()运行的结果:
虚拟机为该线程命名的名称为:Thread-0
main线程的名称:main
虚拟机为该线程命名的名称为:线程1
当想了解垃圾收集器的名称时,因为不能管理finalize()方法的运行次数。可能会运行很多次,Console端口可能会覆盖掉其他线程名称的显示,所以单独线程垃圾收集器名称