运行一个 Java 程序就是跑一个 Java 进程,该进程至少有一个线程即主线程,而 main 方法就是主线程的入口;
一、常见多线程名词解释
并发:一个 CPU 核心上,通过快速轮转调度的方式,执行多个进程,微观上 "有先有后";
并行:两个进程同时分别在两个 CPU 核心上执行,微观上 "同时进行";
进程:进程是资源分配的最小单位;
线程:⼀个线程就是⼀个 "执⾏流",每个线程之间都可以按照顺序执行自己的代码,线程是调度执行的最小单位;
终止线程:想要终止线程本质就是让 run 方法执行结束;
线程等待:让一个线程等待另一个线程执行结束,再继续执行;
线程安全:让多个线程同时执行同样的代码,出现的 bug;
进程和线程的区别:
1. 进程包含线程,一个进程可以有一个或者多个线程;
2. 进程和线程都是实现并发编程的,但线程更轻量,更高效;
3. 同一个进程的线程之间,共用同一份资源,如内存,硬盘等,即线程省去了申请资源的开销;
4. 进程之间是有独立性的,一个进程的崩溃不会影响其他进程;同一个进程内的线程之间可能会相互影响(存在线程安全,线程异常等问题);
5. 进程是分配资源的最小单位,线程是调度执行的最小单位;
6. 进程之间的通信比较复杂,需要使用管道,消息队列等机制,线程间通信比较简单,因为它们共享进程的地址空间,可以直接读写共享数据;
二、创建线程的几种方式
1. 继承 Thread(java.long包下) 类,重写 run 方法
(可通过单独定义一个类,或者使用匿名内部类),单独创建一个类不常用;
public static void main(String[] args) {
Thread t1 = new Thread(){
@Override
public void run() {
System.out.println("通过匿名内部类创建线程");;
}
};
t1.start();
}
Thread 类:是 JVM 用来管理线程的⼀个类,每个线程都有⼀个唯⼀的 Thread 对象与之关联;
Thread 类中的 run 方法 是对 Runnable 的重写,run 方法描述了线程的入口,每个线程都是一个独立的执行流,一个线程从入口方法开始执行,即 run 方法,run 方法执行完毕,线程就会结束;
start 方法 用于开启线程,负责调用系统 API,系统创建线程,再调用 run 方法执行线程 ;直接调用 run 方法是不会创建线程的
常用构造方法如下:
常用其他方法如下:
2. 实现 Runnable(java.long包下) 接口,重写 run 方法;
可通过单独创建一个类,或者匿名内部类,或者 lambda 表达式实现,后两者更为常用;
public static void main(String[] args) {
Thread t1 = new Thread(new R