多线程基础
相关概念
多线程
多线程就是同时执行多个应用程序 需要硬件支持
效果上来说就是CPU在多个程序之间快速切换 给人一种多个软件同时执行的感觉
并发: 某一个时刻 多个任务同时在执行 在同一时刻 有多个指令在多个CPU上同时执行
并发: 某个时间段 多个任务同时执行 但是某个时刻只有一个任务在执行 在某一时间段 有多个指令在单个CPU上交替执行
当下电脑执行过程中两种情况会同时存在
并发: 是因为目前的cpu都是多核心的 每个核心执行一个指令多个核心就同时在执行多个指令
并发:每个核心在某一刻 只能执行一个程序指令 之后某一刻 可能在执行其他软件的命令
进程
正在运行的软件
独立性 进程是一个能独立运行的基本单位 同时也是系统分配资源和调度的独立单位
动态性 进程的是指是程序的一次执行过程 进程是动态产生的 动态消亡的
并发性 任何进程都可以同其他进程一起并发执行
线程
是进程中的单个循序控制流 是一条执行路径 应用程序中能做的某个事情
随机性: 一个宪曾在某个时间段内在执行 但是这段时间的某个时刻不一定在执行 此时cpu可以能在执行另一个软件 cpu可以在多个线程 随机快速切换执行
多线程的实现方式
jdk原生支持的
1.继承thread类
2.实现runnable接口
3.实现callable接口
继承Thread类
方法
void run()
想要多线程中执行的代码写在这个方法中 在线程启动后此方法将自动被调用执行
void start()
启动线程的方法 之后java虚拟机会调用run()方法
实现步骤
定义一个类MyThread继承Thread类
在MyThread类中重写run()方法
创建MyThread类的对象
使用线程对象的start()启动线程
public class ThreadDemo01 {
public static void main(String[] args) {
// 3. 创建MyThread类的对象
MyThread mth1 = new MyThread();
MyThread mth2 = new MyThread();
// 4. 使用线程对象的start()启动线程
mth1.start();
mth2.start();
}
}
// 1. 定义一个类MyThread继承Thread类
class MyThread extends Thread{
@Override
// 2. 在MyThread类中重写run()方法
public void run() {
// 这里的代码会在对应的线程启动后自动被执行
for (int i = 0; i < 100; i++) {
System.out.println("新的线程开始执行代码了"+i);
}
}
}
重点解析
问:为什么要冲洗run()方法
因为run()是用封装被线程执行代码的 我们可以想要在多线程环境下运行的代码写在run()方法中 这些代码可以称之为任务
问: run()方法和start()方法的区别
run() 封装多线程执行的代码 封装任务代码的如果直接调用该方法 就是main方法线程中执行普通方法 也就是普通方法的调用
start() 启动线程开启一个新线程 在新县城中执行代码 由jvm调用此线程的run方法执行run中的任务代码
实现Runnalbe接口
Thread构造方法
Thread(Runnable target) 分配一个新的Thread对象
Thread(Runnable target,String name) 分配一个新的Thread对象
Runnable接口中方法
run() 任务方法内部编写要在多线程环境下执行的代码
实现步骤
定义一个类MyRunnable实现Runnale接口
在Myrunnable类中重写run()方法 编写需要在多线程环境下运行的代码