Java 基础复习 Day18
线程(1)
-
并发与并行
并发:多个事项在同一时间段内执行 (交替)
并行:多个事项在同一时刻进行(同时)
-
进程与线程
图片来自网课,如有侵权请联系删除
进程:进入内存执行中的应用程序就叫进程(可通过任务管理器管理进程,停止进程)
线程:是进程的一个执行单元,负责程序的执行
- 线程调度
- 分时调度:所有线程轮流使用cpu的使用权,平均分配每个线程占用cpu的时间
- 抢占式调度:优先让优先级高的线程去使用cpu,如果线程的优先级相同,那么会选择一个(线程随机性),java使用的就是抢占式调度。
Win11在详细信息中可以设置进程的优先级,如果设置为高的话,则cpu优先执行进程中的线程就会几率大一点
-
主线程
对于java而言,主线程是:执行main方法的线程
单线程程序:java程序中只有一个线程,执行从main方法开始,从上向下依次执行
弊端:当中间有异常时,后边的方法都不会再执行
-
多线程程序的创建,一共有两种方式
1.创建Thread类的子类(java.lang.Thread)
实现步骤:
-
创建Thread类的子类
-
重写Thread类的run方法,开启线程任务(确定这个线程要做什么)
-
创建Thread子类的对象
-
调用Thread的方法start,开启新线程,执行run
注意:是调用start(JVM去调用run),而不是直接去执行run。
-
结果:
两个线程并发地执行:当前线程(main)线程和另外一个线程(创建的新线程,执行其run方法)
注意:多次启动一个线程是非法的。特别是当线程已经结束执行后,不能再重新启动。
java程序属于抢占式调度,优先让优先级高的线程去使用cpu,如果线程的优先级相同,那么会选择一个(线程随机性)随机执行。
```java
//1.创建Thread类的子类
public class MyThread extends Thread{
//2.重写Thread类的run方法,开启线程任务(确定这个线程要做什么)
@Override
public void run() {
for (int i = 0; i < 20; i++) {
System.out.println("another thread run: " + i);
}
}
}
//Main方法中开启多线程
public static void main(String[] args) {
//3.创建Thread子类的对象
MyThread mt = new MyThread();
//4.调用Thread的方法start
mt.start();
//主线程的方法执行
for (int i = 0; i < 20; i++) {
System.out.println("main thread run: " + i);
}
}
```
结果随机:哪个进程抢占到cpu哪个进程先执行,所以导致print的结果不按顺序来
another thread run: 0
another thread run: 1
another thread run: 2
another thread run: 3
another thread run: 4
another thread run: 5
another thread run: 6
main thread run: 0
another thread run: 7
another thread run: 8
main thread run: 1
main thread run: 2
another thread run: 9
main thread run: 3
another thread run: 10
another thread run: 11
another thread run: 12
another thread run: 13
another thread run: 14
another thread run: 15
another thread run: 16
another thread run: 17
another thread run: 18
another thread run: 19
main thread run: 4
main thread run: 5
main thread run: 6
main thread run: 7
main thread run: 8
main thread run: 9
main thread run: 10
main thread run: 11
main thread run: 12
main thread run: 13
main thread run: 14
main thread run: 15
main thread run: 16
main thread run: 17
main thread run: 18
main thread run: 19
Process finished with exit code 0
执行原理图示(图片来源于网课,侵权请联系删除):
多线程内存图解(图片来源于网课,侵权请联系删除):