初识多线程编程

news2024/11/17 7:26:50

在这里插入图片描述

文章目录

  • 一、线程
    • 线程与进程的区别
  • 二、多线程编程
    • Thread
    • 创建线程的方法

一、线程

我们开始引入进程,最主要的目的是去解决"并发编程"的问题,电脑进入了多核心,想要提高程序执行速度,就得将这些核心用起来。

我们在每次创建进程的时候都会为其分配空间和资源(速度十分的慢),不仅创建的时候慢,销毁,调度都很慢,这与我们并发编程的目的有所背离。

这时候就引入一个新的概念: 线程,线程也叫轻量级进程,在解决"并发编程"的前提下,让创建,销毁,调度的效率提高,至于为啥会提高,因为线程将创建时申请资源和销毁时释放资源给省下了。

线程与进程的区别

在这里举一个简单的例子,来感受一下: 现在有三个同学想要去教室学习。

第一种方案(多进程):

在这里插入图片描述

我们每个同学分别进了A,B,C教室,因为天很冷,都打开了空调。

第二种方案(多线程):

在这里插入图片描述

我们三个同学进入了同一间教室,打开了空调。

我们对比一下两种方案,第二种方案,资源成本开销要比第一种小很多,空调,桌子板凳都是可以公用一间的,这就是多线程的优势。

线程与进程之间的关系: 进程包含线程,一个进程可以只有一个线程,也可以有多个,但不能没有,只有第一个线程的开销是比较大的。同一个进程里的多个线程,共用了一份资源(内存,文件描述符表)

在这里插入图片描述

在操作系统中,线程是我们系统调用的基本单位,当我们谈到进程调度(当进程只有一个线程时)

线程是通过PCB来描述的,一个进程里的PCB可能是一个可能是多个,PCB里的状态,优先级,上下文,记账信息都是每个线程都是独一份,但是每次进程里的每个线程pid,内存指针,文件描述符表都是一样的。

**多线程与多进程比较: **

在这里插入图片描述

我们多进程的成本和资源开销比较大。

让学生更多,能否更好?

在这里插入图片描述

我们再增加线程时,也不可以一直提高效率,教室的桌子板凳是有限的(CPU核心数),学生太多,教师太吵闹,导致正在学习的同学,无法专心学习。

线程太多,核心数目有限时,不少的时间都浪费到量线程调度上面。

多线程的情况下,会发生线程安全问题。

在这里插入图片描述

当三个同学调节空调温度意见不统一时,就可以发生矛盾(线程不安全),在多进程中,就不会存在这种情况,各开各的,互不影响。

还有一种情况,要是一个教室两个同学放生矛盾,没有处理好,就会发生冲突,影响到整个教师的人。如果一个线程抛异常了,没有处理好,可能会把整个进程带走。

二、多线程编程

Thread

在我们java多线程编程中,最核心的类:Thread,因为这个类是java.lang底下的类,所以我们在使用的时候不需要自己导包。

在这里插入图片描述

class MyThread extends Thread{
    @Override
    public void run() {
        System.out.println("MyThread!");
    }
}
public class Test {
    public static void main(String[] args) {
        Thread t = new MyThread();
        t.start();
        System.out.println("Main!");
    }
}    

我们来看一下我们第一个多线程代码,我来解释一下相关代码。

在这里插入图片描述

@Override表示我们重写父类Thread的run()方法,我们在创建线程对象时.用Thread接受子类对象时,调用run()方法执行的是子类的方法。

在这里插入图片描述

start()是我们线程当中很重要也很特殊的一个方法,当我们调用start()方法时,首先会调用操作系统的API去创建一个真正线程(PCB),并且把要执行指令交给PCB去执行,PCB被调度到CPU执行,执行run()方法。

在这里插入图片描述

我们这里有两个进程,一个是main进程,一个是t.start()创建出来的进程去执行run(),当run()执行完毕之后,该线程销毁。

还有需要注意:线程的执行顺序,并不是我们眼睛所表面看到的顺序,操作系统的调用线程是: 抢占式执行,那个线程先执行取决于操作系统调度器具体实现策略。我们可以通过JDK里所带的工具Jconsole查看我们Java当中的线程。

我们可以在jdk的bin目录下找。

在这里插入图片描述

也可以通过cmd命令访问.

在这里插入图片描述

在这里插入图片描述

我们通过后面的PID发现我们一共有三个进程,因为进程包含线程,我们想查看具体的线程就需要去进程里面查看。

我们发现第一个是jconsole,因为jconsole也是java也写。

第二个是IDEA。

第三个就是我们所运行的程序。

在这里插入图片描述

我们点进来,发现除了我们的main线程和Thread-0线程之外还有许多,这些线程都是JVM自带的。

创建线程的方法

1.继承Thread,重写run

class MyThread extends Thread{
    @Override
    public void run() {
        System.out.println("MyThread!");
    }
}
public class Test {
    public static void main(String[] args) {
        Thread t = new MyThread();
        t.start();
        System.out.println("Main!");
    }
}    

2.实现Runnable接口

class MyRunnable implements Runnable{
    @Override
    public void run() {
        System.out.println("Hello thread!");
    }
}
public class Test {
    public static void main(String[] args) {
        //去描述一下任务
        Runnable runnable = new MyRunnable();
        Thread t = new Thread(runnable);
        t.start();
    }
}    

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

public static void main(String[] args) {
        Thread t = new Thread(){
            @Override
            public void run() {
                System.out.println("MyThread!");
            }
        };
        t.start();
    }

创建了一个Thread的子类(未命名),所以才叫匿名内部类。

创建了子类的实例,让t指向。

4.使用匿名内部类,实现Runnable

public static void main(String[] args) {
        Thread t = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("MyThread!");
            }
        });
        t.start();
}

创建一个类,实现Runnable创建实列传给构造方法。

5.lambda表达式

public static void main(String[] args) {
        Thread t = new Thread(()->{
            System.out.println("MyThread!");
        });
        t.start();
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【vue3】代码格式化和volar卡顿问题解决

一、格式化策略 用eslint做代码检查和格式化是很方便的东西; 这里我们使用vscode完成这些操作; 在代码保存的时候,顺便完成格式化操作 1)装上eslint和prettier插件 2)装完插件之后,我们需要配置一下 打开 文件 > 首选项 >…

「Whale Cast」功能更新,让全网看到您的直播高光时刻

直播为王的时代,品牌如何在直播中增强运营能力,降本增效? 11 月,「帷幄开播 Whale Cast」迎来新的功能更新,一起来看一看,它将为您的直播间运营优化带来哪些强大助力。 我们将分别按智能裁切、直播场控、直…

springboot定义统一的异常返回格式(全局,特定,自定义)等

一 设置全局统一的返回格式 1.1 没有加全局异常处理 1.这里设置一个字符串为空指针异常,然后看看返回给前端的信息。 2.返回结果 3.效果看起来不友好的提示 1.2 添加全局异常处理 1.代码:添加一个全局异常处理类 ControllerAdvice public class Glo…

MySQL存在这么多的数据引擎 , 所有的引擎都在使用吗

一 . 前言 总是看到有说MySQL某个数据引擎哪里哪里有问题的 , 让我一度怀疑我是不是Mysql 用的不对 , 有些问题都没有遇到过,所以我非常好奇 , 数据库的存储引擎 , 大家真的在用吗? MySQL 官方文档:: MySQL 5.7 Reference Manual :: 15 Alternative Storage Engi…

[附源码]计算机毕业设计基于springboot学习互助辅助系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

JavaScript高级程序设计 第4版 --表单脚本

表单脚本 1、基础  acceptCharset:服务器可以接收的字符集,等价于 HTML 的 accept-charset 属性。 action:请求的 URL,等价于 HTML 的 action 属性。 elements:表单中所有控件的 HTMLCollection。 enctype&a…

详解设计模式:状态模式

状态模式(State Pattern)也被称为状态机模式(State Machine Pattern),是在 GoF 23 种设计模式中定义了的行为型模式。 在状态模式 类的行为是基于它的状态改变的。在状态模式中,我们创建表示各种状态的对象…

9.图片分类数据集

1. 图像分类数据集 MNIST数据集 [LeCun et al., 1998] 是图像分类中广泛使用的数据集之一,但作为基准数据集过于简单。 我们将使用类似但更复杂的Fashion-MNIST数据集。 %matplotlib inline import torch import torchvision from torch.utils import data from t…

idea配置tomcat热部署不生效问题

idea中配置了tomcat的“update classes and resources”后,点击run之后,每次修改代码都没有及时生效,也就是没有成功进行热部署。 在idea中实现热部署,要先设置自动编译,再选择正确的运行模式(Debug运行&am…

SSM和SpringBoot整合

目录 一、整合Mybatis 配置文件 pom.xml application.yml jdbc.properties generatorConfig.xml 启动类 测试 二、整合Mybatis-plus Mybatis-plus 新建项目 pom.xml application.yml 在项目导入mybatis-plus的代码生成的类 完成基本增删改查方法开发 三、Mybatispl…

常用数据库之sql server的使用和搭建

1.1 介绍 关系型数据库,SQLServer是由微软公司开发的一种关系型据库管理系统,它已广泛用于电子商务、银行、保险、电力等行业。SQLServer提供了对XML和Internet标准的支持,具有强大的、灵活的、基于Web的应用程序管理功能。 1.2 优缺点 优点…

毕业设计-基于机器视觉的安全帽佩戴识别系统

目录 前言 课题背景与意义 课题实现技术思路 目标检测 算法检测 算法实现 最后 前言 📅大四是整个大学期间最忙碌的时光,一边要忙着准备考研,考公,考教资或者实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越…

企业子网划分详解

一、IP协议 1、IP协议简介 IP协议是TCP/IP协议族的基石,它为上层提供无状态、无连接、不可靠的服务,也是Socket网络编程的基础之一。 IP协议特点: 无状态:指IP通信双方不同步传输数据的状态信息,因此所有IP数据报的发送,传输,接收都是相互独立的。这种服务最大缺点是…

Web5到底是什么?Web4去哪了?

Web3咱还没搞明白,Web3还没有完全的投入应用 ,这Web5怎么就来了? 在今年6月召开的加密盛宴Consensus上,推特创始人比特必信徒杰克多西,首次提出全新Web5的概念,并公开呛声Web3的VC们可以洗洗睡了&#xff…

【Lilishop商城】No2-7.确定软件架构搭建六(本篇包括延时任务,会用到rocketmq、redis)

仅涉及后端,全部目录看顶部专栏,代码、文档、接口路径在: 【Lilishop商城】记录一下B2B2C商城系统学习笔记~_清晨敲代码的博客-CSDN博客 全篇只介绍重点架构逻辑,具体编写看源代码就行,读起来也不复杂~ 谨慎&#xf…

使用python进行贝叶斯统计分析

本文讲解了使用PyMC3进行基本的贝叶斯统计分析过程. 最近我们被客户要求撰写关于贝叶斯统计分析的研究报告,包括一些图形和统计输出。 # 导入 import pymc3 as pm # python的概率编程包 import numpy.random as npr # numpy是用来做科学计算的 import matplotlib…

cubeIDE开发,结合图片取模工具,stm32程序在LCD显示图片

一、图片取模工具(imag2lcd) 我们前面将汉字显示时说过,嵌入式LCD屏显示就是通过LCD屏幕数据接口给每个屏幕像素给出一个颜色值实现实时渲染显示出来。只不过文字显示时,给出的是一个二进制点阵,然后根据二进制中的“1…

Java文件输入输出(简单易懂版)

文章目录写在前面文件输入文件输出写在前面 在Java中不论文件输入还是输出都会用到File类,参考这篇文章Java File类(文件操作类)详解这里会涉及到绝对路径、相对路径、路径中的斜杠“/”和反斜杠“\”,有些小伙伴可能不熟悉&…

数据结构—B树、B+树

文章目录B树B树的特点为什么要有B树:红黑树和B树比较B树B树的特点B树构建过程查询时数据提供数据磁盘向cpu推送数据B树的优点总结为什么要有B树:B树用途:为什么要有B树:B树用途:———————————————————…

WorkTool企微机器人APP分享自定义小程序

移动端应用怎么分享自定义小程序到企业微信 前言 什么是自定义小程序,就是我们可以通过业务逻辑或代码来动态修改每次发出的小程序所附带的路径(path)和参数(params),以此来控制每次发出的小程序都是有不同含义的,但企业微信并不让我们这样…