部分源码解释在代码段的注释内
每一个 Java 程序启动后,会默认开启一个线程,称为主线程(main 方法所在的线程)
每一个线程都是一个 java.lang.Thread 对象,可以通过 Thread.currentThread 方法获取当前的线程对象
开启线程的2种方法
(1)传入一个Runnable实例,在run方法中编写子线程需要执行的任务
//第1种方法
public class Main {
public static void main(String[] a) {
Thread tj = new Thread(new Runnable() {
@Override
public void run() {//把线程想执行的任务写在run方法里即可
System.out.println("新线程的名字 - "+Thread.currentThread().getName());
}
});
tj.setName("汤键");//更改线程名称为“汤键” 不更改默认为Thread-0
tj.setPriority(10);//更改线程优先级为10 不更改默认为普通优先级为5 线程优先级范围为1—10 数值越大优先级越高
tj.start();//启动线程;Thread调用start方法后,内部会调用线程自己的run方法
}
}//可用Lambda表达式优化
(2)继承Thread类,重写run方法
//第2种方法
class tt extends Thread{
public void run() {
//System.out.println("新线程的名字 - "+getName());
//使用getName()不会准确知道当前代码执行在哪一线程,只会返回new时内部分配的固定名称,它不会管你线程是否启动成功,都会分配这个名字
System.out.println("新线程的名字 - "+Thread.currentThread().getName());
}
}
public class Main {
public static void main(String[] a) {
Thread tj = new tt();
tj.setName("汤键");
tj.setPriority(10);
tj.start();
//直接调用run方法不调用start方法相当于没继承Thread,还是在主线程中执行,是错的
}
}
看Thread源码可知start方法内是有个start0的native本地方法会向cpu,系统申请一些资源,申请到了才会执行run方法,才真正地把线程开启了,才是真正的多线程