多线程(初阶)
迪丽瓦拉
2025-05-28 05:31:22
0

文章目录

  • 一.初始线程(Thread)
    • 1.1.线程的概念
    • 1.2.线程的优势
      • 1.2.1.线程比进程更轻量
      • 1.2.2.并发编程
    • 1.3.线程和进程的区别
  • 二.Thread类方法
    • 2.1. java 中创建线程的方法
      • 2.1.1. 继承Thread,重写run
      • 2.1.2. 实现Ruuable接口
      • 2.1.3. 使用匿名内部类,继承Thread
      • 2.1.4.使用匿名内部类,实现Ruunable
      • 2.1.5.使用Lambda表达
    • 2.2.Thread 类及常见方法
      • 2.2.1. Thread的构造方法
      • 2.2.2.Thread的几个常见属性
        • 1.前/后台线程
        • 2.是否存活
        • 3.线程中断
      • 2.2.3.等待一个线程join
      • 2.2.4. 休眠当前线程
    • 2.3. 线程的状态
      • 2.3.1.java中线程的状态
      • 2.3.2.线程状态和转移

一.初始线程(Thread)

1.1.线程的概念

一个线程就是一个 “执行流”. 每个线程之间都可以按照顺序执行自己的代码. 多个线程之间 “同时” 执行着多份代码. 线程也可以理解成是在进程中独立运行的子任务.

比如,WeChat.exe运行时就有很多的子任务在同时运行。形如,好友视频线程、下载文件线程、传输数据线程等,这些不同的任务或者说功能都可以同时运行,其中每一项任务完全可以理解成是“线程”在工作,传文件、听音乐、发送图片表情等功能都有对应的线程在后台默默地运行.

1.2.线程的优势

1.2.1.线程比进程更轻量

 - 创建线程比创建进程更快- 销毁线程比销毁进程更快- 调度线程比调度进程更快

1.2.2.并发编程

如Windows系列,使用多任务操作系统Windows后,可以最大限度地利用CPU的空闲时间来处理其他的任务,比如一边让操作系统处理正在由打印机打印的数据,一边使用Word编辑文档.所以使用多线程技术后,可以在同一时间内运行更多不同种类的任务.

并行 微观上,同一时刻,两个核心上的进程,是同时执行的
并发 微观上,同一个时刻,一个核心上只能运行一个进程,但是它能够快速的进程切换(宏观让人感知不到).
这些都是内核负责处理的,应用程序感知不到,因此往往把并行和并发,统称为并发

单任务和多任务的模型图
在这里插入图片描述

在多任务中,CPU可以在任务1和任务2之间来回切换,使任务2不必等5秒后执行,运行效率提升

1.3.线程和进程的区别

  • 进程是包含线程的. 每个进程至少有一个线程存在,即主线程.
  • 进程和进程之间不共享内存空间. 同一个进程的线程之间共享同一个内存空间(主要指的是内存和文件描述符表).

进程是系统分配资源的最小单位,线程是系统调度的基本单位(如果每个进程有多个线程,每个线程是独立在CPU调度的)

一个线程是通过一个PCB来描述的,所以一个进程里面可能对应一个PCB,也可能是对应多个.
PCB里的状态,上下文,优先级,记账信息,都是每个线程自己的,各自记录各自的,但是同一个进程的PCB之间,pid是一样的,内存指针和文件描述表也是一样的.

线程模型,天然就是资源共享的,多线程争抢同一个资源(同一个变量)非常容易触发竞争
而进程模型,天然就是资源隔离的,不容易触发,进行进程间的通信的时候,多个进程访问同一个资源,可能出现问题
线程是操作系统中的概念. 操作系统内核实现了线程这样的机制, 并且对用户层提供了一些 API 供用户使,而Java 标准库中 Thread 类可以视为是对操作系统提供的 API 进行了进一步的抽象和封装.

二.Thread类方法

先来介绍start,就是调用操作系统的API,通过操作系统内核创建线程的PCB,并且把要执行的指令加给PCB,当PCB被调度到CPU上执行的时候,也就执行到了线程run方法中的代码

Thread  t = new MyThread();
t.start();

start是创建了个线程,由新的线程来执行run方法

2.1. java 中创建线程的方法

2.1.1. 继承Thread,重写run

在这里插入图片描述

2.1.2. 实现Ruuable接口

在这里插入图片描述

2.1.3. 使用匿名内部类,继承Thread

在这里插入图片描述

2.1.4.使用匿名内部类,实现Ruunable

在这里插入图片描述

2.1.5.使用Lambda表达

在这里插入图片描述

2.2.Thread 类及常见方法

2.2.1. Thread的构造方法

方法说明
Thread()创建线程对象
Thread(Runnable target)使用 Runnable 对象创建线程对象
Thread(String name)创建线程对象,并命名
Thread(Runnable target, String name)使用 Runnable 对象创建线程对象,并命名
Thread t1 = new Thread();
Thread t2 = new Thread(new MyRunnable());
Thread t3 = new Thread("名字");
Thread t4 = new Thread(new MyRunnable(), "名字");

2.2.2.Thread的几个常见属性

在这里插入图片描述

  • ID 是线程的唯一标识,不同线程不会重复
  • 名称是各种调试工具用到
  • 优先级高的线程理论上来说更容易被调度到
  • 关于后台线程,需要记住一点:JVM会在一个进程的所有非后台线程结束后,才会结束运行。
  • 是否存活,即简单的理解,为 run 方法是否运行结束了

1.前/后台线程

前台线程,会阻止进程结束,前台线程的工作没完成,进程是结束不了的
后台线程,不会阻止进程结束,后台线程工作没完成,进程也是可以结束的
手动创建的线程,默认都是前台的,包括main默认也是前台的其他的jvm自带的线程都是后台线程
也可以手动的使用setDeamon设置成后台线程(守护线程)

2.是否存活

在这里插入图片描述
在调用是start之前,调用isAlive()是false,调用start之后,isAlive就是true,如果内核里线程把run运行完了,此时线程销毁,pcb随之释放,但是Thread t这个对象不一定被释放,此时isAlive是false

public class Thread5 {public static void main(String[] args) throws InterruptedException {Thread t = new Thread(()->{while (true){System.out.println("Hellp Thread !");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}});System.out.println(t.isAlive());t.start();while (true){Thread.sleep(1000);System.out.println(t.isAlive());}}
}

t的run还没跑,isAlive就是false
t的run还在跑,isAlive就是true
t的run跑完l,isAlivejiusfalse

3.线程中断

中断的意思是,不是让线程立即终止,而是通知,应该要停止,是否真的停止,取决于线程具体的代码写法

  1. 使用标志位来控制位线程是否要停止

  2. 使用Thread自带的标志位,来进行判断

方法说明
public void interrupt()中断对象关联的线程,如果线程正在阻塞,则以异常方式通知,否则设置标志位
public static boolean interrupted()判断当前线程的中断标志位是否设置,调用后清除标志位
public boolean isInterrupted()判断对象关联的线程的标志位是否设置,调用后不清除标志位

在这里插入图片描述
intterrupt做两件事
1.把线程内部的标志位(boolean)给设置成true
2.如果线程在进行sleep,就会触发异常,把sleep唤醒,但是sleep在唤醒的时候,会把刚才设置的这个标志,在设置回false
这里是引用
如果线程因为调用 wait/join/sleep 等方法而阻塞挂起,则以 InterruptedException 异常的形式通
知,清除中断标志
当出现 InterruptedException 的时候, 要不要结束线程取决于 catch 中代码的写法. 可以选择
忽略这个异常, 也可以跳出循环结束线程.
如下列图片
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

2.2.3.等待一个线程join

线程是一个随机调度的过程,等待线程,就是控制两个线程的结束顺序

方法说明
public void join()等待线程结束
public void join(long millis)等待线程结束,最多等 millis 毫秒
public void join(long millis, int nanos)同理,但可以更高精度

在这里插入图片描述
当开始执行的时候,他已经结束,此时join不会阻塞,就会立即返回

2.2.4. 休眠当前线程

让线程休眠,本质上就是让这个线程不参与调度

方法说明
public static void sleep(long millis) throws InterruptedException休眠当前线程 millis毫秒
public static void sleep(long millis, int nanos) throws InterruptedException可以更高精度的休眠

在这里插入图片描述

一旦线程进入阻塞状态,对应PCB就进入阻塞队列,此时就暂时无法参与调度

PCB是使用链表来组织的(并不具体)实际的情况并不是一个简单的链表,这是一系列以链表为核心的数据结构

2.3. 线程的状态

状态是针对当前的线程调度的情况来描述的,线程是调度的基本单位,状态是线程的属性

2.3.1.java中线程的状态

在java对于线程的状态,进行细化
在这里插入图片描述
线程的状态是一个枚举类型Thread.State

public static void main(String[] args) {for (Thread.State state: Thread.State.values()) {System.out.println(state);}}

在这里插入图片描述

  • NEW: 安排了工作, 还未开始行动
  • RUNNABLE: 可工作的. 又可以分成正在工作中和即将开始工作.
  • BLOCKED:这几个都表示排队等着其他事情
  • WAITING: 这几个都表示排队等着其他事情
  • TIMED_WAITING: 这几个都表示排队等着其他事情
  • TERMINATED: 工作完成了.

2.3.2.线程状态和转移

先简单了解一下
在这里插入图片描述

相关内容

热门资讯

linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
C++ 机房预约系统(六):学... 8、 学生模块 8.1 学生子菜单、登录和注销 实现步骤: 在Student.cpp的...
A.机器学习入门算法(三):基... 机器学习算法(三):K近邻(k-nearest neigh...
数字温湿度传感器DHT11模块... 模块实例https://blog.csdn.net/qq_38393591/article/deta...
有限元三角形单元的等效节点力 文章目录前言一、重新复习一下有限元三角形单元的理论1、三角形单元的形函数(Nÿ...
Redis 所有支持的数据结构... Redis 是一种开源的基于键值对存储的 NoSQL 数据库,支持多种数据结构。以下是...
win下pytorch安装—c... 安装目录一、cuda安装1.1、cuda版本选择1.2、下载安装二、cudnn安装三、pytorch...
MySQL基础-多表查询 文章目录MySQL基础-多表查询一、案例及引入1、基础概念2、笛卡尔积的理解二、多表查询的分类1、等...
keil调试专题篇 调试的前提是需要连接调试器比如STLINK。 然后点击菜单或者快捷图标均可进入调试模式。 如果前面...
MATLAB | 全网最详细网... 一篇超超超长,超超超全面网络图绘制教程,本篇基本能讲清楚所有绘制要点&#...
IHome主页 - 让你的浏览... 随着互联网的发展,人们越来越离不开浏览器了。每天上班、学习、娱乐,浏览器...
TCP 协议 一、TCP 协议概念 TCP即传输控制协议(Transmission Control ...
营业执照的经营范围有哪些 营业执照的经营范围有哪些 经营范围是指企业可以从事的生产经营与服务项目,是进行公司注册...
C++ 可变体(variant... 一、可变体(variant) 基础用法 Union的问题: 无法知道当前使用的类型是什...
血压计语音芯片,电子医疗设备声... 语音电子血压计是带有语音提示功能的电子血压计,测量前至测量结果全程语音播报࿰...
MySQL OCP888题解0... 文章目录1、原题1.1、英文原题1.2、答案2、题目解析2.1、题干解析2.2、选项解析3、知识点3...
【2023-Pytorch-检... (肆十二想说的一些话)Yolo这个系列我们已经更新了大概一年的时间,现在基本的流程也走走通了,包含数...
实战项目:保险行业用户分类 这里写目录标题1、项目介绍1.1 行业背景1.2 数据介绍2、代码实现导入数据探索数据处理列标签名异...
记录--我在前端干工地(thr... 这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前段时间接触了Th...
43 openEuler搭建A... 文章目录43 openEuler搭建Apache服务器-配置文件说明和管理模块43.1 配置文件说明...