多线程的主要操作方法都在Thread类中定义了。
线程的命名与取得
多线程的运行状态是不确定的,那么在程序的开发之中为了可以获取一些需要使用的线程就只能够依靠线程的名字进行操作。所以线程的名字是一个至关重要的概念,这样在Thread类之中就提供有线程名称的处理。
- 构造方法:public Thread(Runnable target,String name);
- 设置名字:public final void setName(String name);
- 取得名字:public final void getName();
对于线程对象的获取是不可能只是依靠一个this来完成的,因为线程的状态不可控,但是有一点是明确的,所有的线程对象一定要执行run()方法,那么这个时候可以考虑获取当前线程,在Thread类里面提供有获取当前线程的方法。
获取当前线程:public static Thread currenrThread();
范例:观察线程的命名操作
package multithreading;
public class Name {
public static void main(String[] args) {
Thread1 thread = new Thread1();
new Thread(thread,"线程A").start();//设置了线程名字
new Thread(thread).start(); //未设置线程名字
new Thread(thread,"线程B").start();//设置了线程名字
}
}
class Thread1 implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread().getName());//输出当前线程对象的名字
}
}
线程A
线程B
Thread-0
当开发者为线程设置名字的时候就是用设置的名字,而如果没有设置名字,则会自动生成一个不重复的名字。这种自动的编号命名主要是依靠了static属性完成的,在Thread类里面定义有如下操作。
private static int threadInitNumber;
private static synchronized int nextThreadNum() {
return threadInitNumber++;
}
现在将主方法修改:
public class Name {
public static void main(String[] args) {
Thread1 thread = new Thread1();
new Thread(thread,"线程对象").start();//设置了线程名字
thread.run();//线程直接调用run()方法
}
}
main
线程对象
此时通过代码可以发现当使用了“thread.run()”直接在主方法之中调用线程类对象中的run()方法所获得的线程对象名字为“main”,所以可以得出一个结论:主方法也是一个线程。所有的线程都是在进程上的一个划分,那么进程在哪里?其实每当使用java命名执行程序的时候就表示启动了一个JVM的进程,一台电脑上可以同时启动若干个JVM的进程,每一个JVM都会有各自的线程。
在任何开发之中,主线程可以创建若干个子线程,创建子线程的目的是可以将一些复杂逻辑或者比较耗时的逻辑交于子线程处理。主线程负责处理整体流程,而子线程负责处理耗时操作。