所有的线程程序的执行,每一次都是不同的运行结果,因为它会根据自己的情况进行资源抢占,如果想要区分每一个线程,就必须依靠线程的名字。对于线程名字一般而言会在其启动之前进行定义,不建议为启动之后的线程进行更改名称或者是为不同的线程设置重复的名称。
如果想要进行线程名称的操作,可以使用Thread类的如下方法:
构造方法:public Thread(Runnable target,String name);
设置名字:public final void setName(String name);
取得名字:public final String getName()。
对于线程名字的操作,会出现一个问题,这些方法都是属于Thread类的,可是如果换回到Runnable接口的子类,这个类并没有继承Thread类,如果想要取得名字,那么能够取得的就是当
前执行本方法的线程名字,在Thread类里面提供有一个方法:
取得当前线程对象。public static Thread currentThread()
使用public static Thread currentThread()方法获取当前线程对象的名称。
class MyThread implements Runnable {
@Override
public void run() {
System.out.println(Thread.currentThread().getName());//取得当前线程对象的名称
}
}
public class Demo{
public static void main(String [] args){
MyThread mt = new MyThread() ;
new Thread(mt).start();//启动线程
new Thread(mt).start();
new Thread(mt).start();
}
}//执行结果:Thread-0,Thread-1,Thread-2
如果在实例化Thread类的时候没有为其设置名字,那么会自动进行编号命名,保证线程的名字不重复。
通过Thread类的构造方法设置名字:
class MyThread implements Runnable {
@Override
public void run() {
System.out.println(Thread.currentThread().getName());//取得当前线程对象的名称
}
}
public class Demo{
public static void main(String [] args){
MyThread mt = new MyThread() ;
new Thread(mt,"线程A").start();//启动线程
new Thread(mt,"线程B").start();
new Thread(mt,"线程C").start();
}
}//执行结果:线程A,线程B,线程C
通过setName()方法设置名字:
class MyThread implements Runnable {
@Override
public void run() {
System.out.println(Thread.currentThread().getName());//取得当前线程对象的名称
}
}
public class Demo{
public static void main(String [] args){
MyThread mt = new MyThread() ;
Thread t1 = new Thread(mt) ;
t1.setName("线程A");
t1.start() ;
Thread t2 = new Thread(mt) ;
t2.setName("线程B");
t2.start();
}
}//执行结果:线程A,线程B
下面观察一段代码:
class MyThread implements Runnable {
@Override
public void run() {
System.out.println(Thread.currentThread().getName());//取得当前线程对象的名称
}
}
public class Demo{
public static void main(String [] args){
MyThread m1 = new MyThread() ;
new Thread(m1,"线程A").start();
m1.run();
}
}
以上代码运行结果为:main ,线程A。
可以发现,原来主方法就是一个线程(main线程),那么所有在主方法上创建的线程都可以称为main线程的子线程。
通过以上的代码可以发现,线程一直都存在(主方法就是主线程),可是进程去哪儿了呢?
每当使用java命令去解释一个程序类的时候,对于操作系统而言,都相当于启动了一个新的进程,而main线程只是新进程中的一个子线程而已。
提问:每一个JVM启动的时候至少启动几个线程?
答案:两个线程:
main线程:程序的主要执行,以及启动子线程;
gc线程:负责垃圾收集