多线程(初阶)

文章目录

  • 一.初始线程(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.线程状态和转移

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/565.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[蓝桥杯单片机]——八到十一届初赛决赛客观题

第八届初赛 一、填空题 采用外部12MHz晶振,经过系统12分频时定时器获得最大定时长度,此时定时器定时脉冲为1MHz,周期为1s,而定时器计时均为16位加法计数器,即计时长度为。 二、 选择题 ①带阻滤波器是指能通过大多数频…

处理窄区路径规划的业务问题

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录系列文章目录前言一、通过栅格地图的处理解决二、使用bug绕障的方式走出窄区,或者结合边界图形参考bug算法沿边出来三、使用维诺图计…

字符串函数和内存函数

🍕博客主页:️自信不孤单 🍬文章专栏:C语言 🍚代码仓库:破浪晓梦 🍭欢迎关注:欢迎大家点赞收藏关注 字符串函数和内存函数 文章目录字符串函数和内存函数前言1. 字符串函数介绍1.1 s…

【MySQL】MySQL的优化(一)

目录 查看SQL执行频率 定位低效率执行SQL 定位低效率执行SQL-慢查询日志 定位低效率执行SQL-show processlist 查看SQL执行频率 MySQL 客户端连接成功后,通过 show [session|global] status 命令可以查看服务器状态信息。通 过查看状态信息可以查看对当…

jvm类与类加载

1.类加载过程: 首先要加载某个类一定是出于某种目的,比如要运行java程序,那么久必须加载主类才能运行其中的方法,所以一般在这些情况下,如果类没有被加载,就会自动被加载: 1.使用new创建对象时 …

MyBatis开发环境搭建

1.创建工程 2.引入相关的依赖 pom.xml <dependencies><!--1.引入mybatis包--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.4.6</version></dependency><!--2.单元…

FPGA和IC设计怎么选?哪个发展更好?

很多人纠结FPGA和IC设计怎么选&#xff0c;其实往小了说&#xff0c;要看你选择的具体是哪个方向岗位。往大了说&#xff0c;将来你要是走更远&#xff0c;要成为大佬&#xff0c;那基本各个方向的都要有涉及的。 不同方向就有不同的发展&#xff0c;目前在薪资上IC设计要比FP…

Qt之高仿QQ系统设置界面

QQ或360安全卫士的设置界面都是非常有特点的,所有的配置项都在一个垂直的ScrollArea中,但是又能通过左侧的导航栏点击定位。这样做的好处是既方便查看指定配置项,又方便查看所有配置项。 一.效果 下面左边是当前最新版QQ的系统设置界面,右边是我的高仿版本,几乎一毛一样…

【Linux】进程的程序替换

文章目录1. 程序替换1.创建子进程的目的是什么&#xff1f;2.了解程序是如何进行替换的3. 程序替换的基本原理当创建进程的时候&#xff0c;先有进程数据结构&#xff0c;还是先加载代码和数据&#xff1f;程序替换是整体替换&#xff0c;不是局部替换execl 返回值4. 替换函数1…

【三维几何学习】从零开始网格上的深度学习-2:卷积网络CNN篇(Pytorch)

本文参加新星计划人工智能(Pytorch)赛道&#xff1a;https://bbs.csdn.net/topics/613989052 从零开始网格上的深度学习-2:卷积网络CNN篇引言一、概述1.1 卷积操作简述1.2 网格上的面卷积二、核心代码2.1 面卷积2.2 网络框架三、基于CNN的网格分类3.1 分类结果3.2 全部代码引言…

FPGA之时钟规划图解

目录 一、前言 二、时钟规划概念 三、时钟规划的模块 四、时钟规划之时钟单元布局 4.1 BUFG 4.2 BUFH 4.3 BUFR 4.4 BUFIO 五、时钟规划之时钟单元走线 5.1 BUFG->BUFH 5.2 BUFR->FF 5.3 BUFIO->FF 一、前言 对于vivado这类使用verilog语言的进…

《Netty》从零开始学netty源码(七)之NioEventLoop.selectStrategy

NioEventLoop是一个事件轮询器&#xff0c;在它的run方法中其实是一个for死循环&#xff0c;不断重复三个过程&#xff1a;1. 获取IO事件&#xff0c;2. 处理IO事件&#xff0c;3. 处理任务队列中的task&#xff0c;而SelectStractegy就是用于第一步获取IO事件&#xff0c;它的…

css:使用filter和backdrop-filter实现高斯模糊效果

背景 今天接到一个需求是&#xff0c;使用高斯模糊的效果对一个页面进行模糊处理&#xff0c;正好借这个机会来整理一下 css3 中高斯模糊的两个 API API介绍 filter 说明&#xff1a; 该 API 是一个过滤器&#xff0c;不仅能实现高斯模糊&#xff0c;还有很多比如颜色偏移、…

接口文档包含哪些内容?怎么才能写好接口文档?十年测试老司机来告诉你

目录 接口文档结构 参数说明 示例 错误码说明 语言基调通俗易懂 及时更新与维护 总结 那么我们该如何写好一份优秀的接口文档呢&#xff1f; 接口文档结构 首先我们要知道文档结构是什么样子的。接口文档应该有清晰明确的结构&#xff0c;以便开发人员能快速定位自己需…

经典文献阅读之--Dynamic-VINS(动态点滤除VINS)

0. 简介 现在的SLAM算法在静态环境中表现良好&#xff0c;但在动态环境中很容易失败。最近的工作将基于深度学习的语义信息引入到SLAM系统以减轻动态对象的影响。然而&#xff0c;在资源受限的机器人的动态环境中应用鲁棒定位仍然具有挑战性。所以《RGB-D Inertial Odometry f…

ES+Redis+MySQL,这个高可用架构设计太顶了!

一、背景 会员系统是一种基础系统&#xff0c;跟公司所有业务线的下单主流程密切相关。如果会员系统出故障&#xff0c;会导致用户无法下单&#xff0c;影响范围是全公司所有业务线。所以&#xff0c;会员系统必须保证高性能、高可用&#xff0c;提供稳定、高效的基础服务。 …

vue笔记

第一个Vue应用 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name"viewport" content"widthdevice-…

【零基础入门前端系列】—动画和弹性盒模型(二十四)

【零基础入门前端系列】—动画和弹性盒模型&#xff08;二十四&#xff09; 一、概念 动画是使元素从一种样式逐渐变化为另一种样式&#xff0c;你可以改变任意多的样式任意多的次数。 请用百分比来规定变化发生的时间&#xff0c;或用关键词from和to&#xff0c;等同0%和10…

购物清单(蓝桥杯C/C++省赛)

目录 1 问题描述 2 文件的读取格式 3 代码实现 1 问题描述 小明刚刚找到工作&#xff0c;老板人很好&#xff0c;只是老板夫人很爱购物。老板忙的时候经常让小明帮忙到商场代为购物。小明很厌烦&#xff0c;但又不好推辞。 这不&#xff0c;XX大促销又来了&#xff01;老板…

项目实战典型案例26——nacos的命名空间名称和id不一致带来的思考

nacos的命名空间名称和id不一致带来的思考一&#xff1a;背景介绍Nacos命名空间相关知识点思考总结一&#xff1a;背景介绍 项目用的naocs做的配置中心和服务发现。由于开发环境和本地环境使用的都是同一个命名空间&#xff0c;我们多个服务相互调用的时候&#xff0c;由于开发…
最新文章