目录
1、概念
1.1 进程
狭义定义:是正在运行的程序的实例。
广义定义:是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。一般由程序,数据集合和进程控制块三部分组成
·1.2 线程
定义:程序执行中一个单一的顺序控制流程,是程序执行流的最小单元。
1.3 进程与线程的区别和联系
①、不同进程之间的 资源不共享
②、线程之间的资源 可以共享
③、线程包含在进程之中的,一个进程至少有一个线程,也可以有多个线程
④、线程是程序执行的最小单位
⑤、进程是重量级的,线程是轻量级。CPU在线程之间的切换要比进程之间的切换块
2、生命周期
2.1 线程的生命周期
定义:是线程从初始化完成,到最后的销毁的过程 称之为线程生命周期
2.2 生命周期的状态
新生态: new
线程刚被创建出来,还没进行任何操作。
就绪态: runable
线程已被开启,开始争抢 CPU 的时间片
运行态:run
线程已经抢到 CPU的时间片,开始执行线程中的逻辑代码
堵塞态:Interrupt
一个线程在运行过程中,收到某些操作的影响,放弃已经获取到的CPU时间片。并且不再参与CPU时间片的争夺。此时线程处于挂起
死亡态 :dead
一个线程需要被销毁。
3、多线程的实现
3.1 继承 Thread 类
方式一: 继承 Thread 类,重写 run 方法,使用 start 方法开启线程。代码如下:
/**
* 自定义线程类
*/
public class MyThread extends Thread {
/*
* 重写 run 方法
* 将需要并发执行的任务写在 run 方法中
*/
@Override
public void run() {
for (int i = 0; i < 10; i++){
System.out.println("子线程中的 "+i);
}
}
}
public class ThreadDemo {
public static void main(String[] args) {
// 线程实例化
MyThread thread = new MyThread();
thread.start();
System.out.println("main 线程执行完毕");
}
}
3.2 实现 Runnable 接口
方式二: 通过实现 Runnable 接口,重写 run 方法。将 Runnable 接口的实现类作为参数 传入Thead 类中。
Runnable r = () -> {
for(int i = 0; i< 10; i++){
System.out.println("子线程中执行" + i);
}
};
Thread t = new Thread(r);
t.start();
System.out.println("main 线程执行完毕");
3.3 补充
①、继承Thread 类的方式实现多线程比较直观和简单, 但它的弊端是java是单继承的,继承了 Thread 类后就不能继承其他类
②、实现 Runnable 接口方式可以避免单继承问题