多线程
概述
我们在之前, 学习的程序在没有跳转语句的前提下, 都是由上至下一依次执行. 那现在想要设计一个程序, 边打游戏边听歌, 怎么设计?
要解决上述问题, 咱们得使用多进程或者多线程来解决.
并发与并行
- 并发: 指两个或多个事件在同一个事件段内发生
- 并行: 指两个或多个事件在同一时刻发生 (同时发生)
在操作系统中, 安装了多个程序, 并发指的是在一段时间内宏观上有多个程序同时运行. 这在单 CPU 系统中, 每一时刻只能有一道程序执行, 即微观上这些程序是分时的交替运行, 只不过给人感觉是同时运行, 那是因为分时交替运行的时间是非常短的.
而在多个 CPU 系统中, 则这些可以并发执行的程序便可以分配到多个处理器上 (CPU), 实现多任务并行执行. 即利用每个处理器来处理一个可以并发执行的程序, 这样多个程序便可以同时执行. 目前电脑市场上说的多核 CPU, 便是多核处理器. 核越多, 并行处理的程序越多, 能大大的提高电脑运行的效率.
单核处理器的计算机肯定是不能并行的处理多个任务的, 只能是多个任务在单个 CPU 上交替运行. 同理, 线程也是一样的, 从宏观角度上理解线程是并行运行的, 但是从微观角度上分析却是串行运行的, 即一个线程一个线程的去运行. 当系统只有一个 CPU 时, 线程会以某种顺序交替执行多个线程, 我们把这种情况称之为线程调度.
线程与进程
进程
进程: 是指一个内存中运行的应用程序, 每个进程都有一个独立的内存空间. 有的应用程序可以同时运行多个进程. 进程也是程序的一次执行过程, 是系统运行程序的结伴单位. 系统运一个程序即是一个进程从穿件, 运行到消亡的过程.
查看进程:
线程
线程: 线程是进程中的一个执行单元, 复杂当前进程中程序的执行, 一个进程至少有一个线程. 一个进程中可以有多个线程的, 这个应用程序也可以称之为多线程程序.
线程的调度:
- 分时调度: 所有线程轮流只用 CPU 的使用权, 平均分配每个线程占用 CPU 的时间
- 抢占式调度: 优先让优先级高的线程使用 CPU, 如果线程的优先级相同, 那么会随机选择一个 (线程随机性). Java 使用的是抢占式调度
创建线程类
Java 使用java.lang.Thread
类代表线程, 所有的线程对象都必须是 Thread 类或其子类的实例. 每个线程的作用是完成一定的任务, 实际上就是执行一段程序流即一段顺序执行的代码. Java 使用线程执行体来代表这段程序. Java 中通过继承 Thread 类来创建并启动多线程. 步骤如下:
- 定义 Thread 类的子类, 并重写该类的 run() 方法. 该 run() 方法的方法体就代表了线程需要完成的任务, 因此把 run() 方法称为线程执行体
- 创建 Thread 子类的实例, 即创建了线程对象
- 调用线程对象的 start() 方法来启动该线程
自定义线程类
public class MyThread extends Thread {
// 定义指定线程名称的构造方法
public MyThread(String name) {
// 调用父类的String参数的构造方法, 指定线程的名称
super(name);
}
/**
* 重写run方法, 完成该线程执行的逻辑
*/
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(getName() + ": 正在执行!" + i);
}
}
}
测试类
public class Test {
public static void main(String[] args) {
// 创建自定义线程对象
MyThread mt = new MyThread("新的线程!");
// 开启新线程
mt.start();
// 在主方法中执行for循环
for (int i = 0; i < 10; i++) {
System.out.println("main线程!" + i);
}
}
}