线程命名和取得
- 线程命名和取得
在多线程的开发之中,所有的线程对象如果在不加控制的情况下一旦创建则会一直持续执行,如果需要进行线程的延缓执行或者是进行线程的资源让出等等,都可以通过Thread类里面提供的方法进行控制。
线程命名和取得
在整个的操作系统之中,所有的线程的执行是随机的,所以如果要进行某些线程的控制,最佳的做法是通过线程名称来进行标注,这样一来线程名称就有着正常重要的存在意义,那么在实际的开发过程之中一定不要设置重名的线程,或者为一个已经运行的线程修改名字,在Thread类里面有提供如下的与线程名称有关的操作方法。
但是在获取线程名称的时候需要注意一点:所有的线程都是不固定的执行状态,可以获得的名称一般都属于当前正在运行的线程对象,而要想获取当前正在运行的线程对象,就必须依靠Thread类提供的一个重要方法:
//直接在方法的内部来获取当前执行的线程对象的名称
public static Thread currentThread()//该方法可以直接通过类名调用
demo:
public class MyThread6 {
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
new Thread(()->{
System.out.println("当前的线程名称为:"+Thread.currentThread().getName());
},"线程对象"+i).start();
}
}
}
执行结果:
以上操作的返回的线程对象是动态的返回结果,但线程对象名称都是手动命名的。
demo2:
package hello;
public class MyThread6 {
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
new Thread(()->{
System.out.println("当前的线程名称为:"+Thread.currentThread().getName());
}).start();
}
}
}
执行结果:
可以看出默认情况下线程名称采用“Thread-x”的形式进行定义,而且所有的对象都会有一个自动增长的数据编号,如果要想知道这种自动编号的实现,可以观察Thread类内部实现机制。
在Thread类的内部通过static关键字实现了这种线程名称的自动的ID生成,每当创建一个线程对象,并且没有为其设置名称的时候就会1由构造方法的内部通过static计数来生成一个不会重复的线程ID号。
Demo3
public class MyThread7 implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
public static void main(String[] args) {
MyThread7 myThread7 = new MyThread7();
myThread7.run();
new Thread(myThread7).start();
}
}
输出:
可以发现,通过对于MyThread7类之中的run()方法有两种调用形式:一种是直接利用Thread线程启动进行调用,另外一种是直接使用对象进行方法的调用,最终的结果可以发现通过主方法中的对象对象直接调用的run()方法所获得的线程名称为“main”,意味着主方法也是一个线程。
所有的线程都是在进程里面创建的,那么请问,进程在哪里?每当使用java命令执行一个类的时候就会在操作系统的内部为其分配一个进程,而现在所有的程序执行的时候都是基于线程的方式执行的,其中会由JVM帮助用户手工的创建一个主线程(main),而后再有主线程创建若干个子线程。
当程序执行之后会通过java命令启动一个JVM进程,当程序执行完毕之后该JVM的进程会自动消失,而处理整个程序的代码是通过主线程完成的。
通过继承Thread类,实现Runnable,Callable接口实现的多线程都是子线程。