- 认识线程
1.1 概念
进程是系统分配资源的最小单位。
线程是系统调度的最小单位。
一个进程内的线程之间是可以共享资源的。
每个进程至少有一个线程存在,即主线程。
1.2 观察进程和线程
可以通过 JDK 提供的 java 监控工具/命令来观察
打开方式: a. 双击打开
b. cmd 输入 jconsole 命令打开
在 IDEA 中编写好代码, 点击运行, 然后用 jconsole 来观察线程
1.2.1 IDEA 中执运行 main 方法(观察让主线程阻塞)
(Java 命令代码执行:启动系统 main 方法,一般是C语言的 main 入口函数----系统级别的 main 线程,系统级别的主线程)
1.2.2 在子线程中让线程阻塞(观察让子线程阻塞)
1.2.3 子线程和主线程都阻塞
1.2.4 在主线程中调用 run 方法
run()方法和 start()方法
Thread 类的 run() 方法只是一个普通方法, 是线程处于运行态的时候,执行的代码;
而start() 方法是启动一个线程,申请系统调度,把线程由创建状态转到就绪态。
1.2.5 主线程和子线程同时运行
执行过程: 主线程申请系统调度子线程,但此时主线程还处于运行状态,所以继续往下执行。当系统调度时间片轮转到子线程时,子线程处于运行状态,执行 run 中的代码。
执行结果: 从概率上讲,“主线程” 字符串会优先打印, 因为只有当 start() 方法调用完, 子线程处于就绪态, 这个时候刚好主线程的时间片用完了, 系统调度切换到子线程执行, 而恰好子线程的执行速度又很快, 在他的时间片用完以前就把 “子线程阻塞” 这个字符串打印出来, 否则还是先打印 “主线程”, 所以说, 先打印 “主线程” 字符串的概率很大。
1.3 多线程的具体执行过程
1.4 创建线程
1.4.1 创建线程 - 方法1: 继承 Thread 类
// 这种方法的好处就是: this 代表的就是当前线程, 不需要使用 Thread.currentThread() 方法来获取当前线程的引用
public class MyThread extends Thread {
@Override
public void run() {
System.out.