【JavaEE】认识多线程

作者主页:paper jie_博客

本文作者:大家好,我是paper jie,感谢你阅读本文,欢迎一建三连哦。

本文录入于《vaEE》专栏,本专栏是针对于大学生,编程小白精心打造的。笔者用重金(时间和精力)打造,将MySQL基础知识一网打尽,希望可以帮到读者们哦。

其他专栏:《MySQL》《C语言》《javaSE》《数据结构》等

内容分享:本期将会分享多线程知识~

前言

在上篇文章中,我们提到了多进程这个概念,通过多进程我们就可以同时多次运行多个程序了.但是,这这里其实还是有一个比较明显的缺点.就是进程在创建的时候需要申请资源,销毁的时候需要释放资源.这就会导致开销比较大.再这个前提下,就延伸出了多线程这个概念.

多线程

什么是多线程

多线程也可以叫轻量级进程.一个进程是可以包含多个线程的,且至少得有一个线程.线程也可以单独执行,每个线程都有一个自己的PCB,有一些支持调度的重要属性,比如状态,优先级,记账信息,上下文等. 多线程主要就是为了解决进程申请资源和释放资源开销大的这个问题.且它也可以提高一个进程的效率.多线程是Java常用的编程方式.

为什么多线程可以解决多进程开销大的问题

这是因为一个进程中的所有线程他们的资源是共享的.随着进程创建好,第一个线程也随着创建好了,第一个线程创建的时候会申请好资源,再后面随着创建好的线程都会共用这份资源.这样就意味着,除了第一个线程需要申请和释放资源外,其他的线程都不用在申请资源了.但这不是随便两个线程就可以共享.这需要一组相关的线程才可以,这就叫做线程组.

如果在深究下去的话,为什么它们能资源共享?这是因为线程中会有内存指针这样的属性,它们的内存指正指向的都是同一块内存,这块内存就是第一个线程申请过来的.硬盘资源也是如此,它们也会有一个文件操作符表,是用来操作硬盘资源的.它们表示的也是同一份硬盘资源. 

这里就可以得出一个概念: 在多线程中,进程是分配资源的基本单位. 线程是调度执行的基本单位.

多线程的缺点 

多线程也不是十全十美的,它也有一些缺点.线程不是越多越好,太多了会导致调度开销比较大. 且进程与进程之间是相互独立的,但是多线程中,一个线程挂了,这个进程中的其他线程有可能也会随着异常中断.

进程与线程的区别 

1. 一个进程包含多个线程,且最少有一个线程.

2. 进程是资源分配的基本单位,线程是调度执行的基本单位.

3. 进程间的资源是独立的,但一个进程内的线程是共享资源的.

4.线程也是一单独的执行流,它也有PCB,里面也有状态,优先级,记账信息,上下文

5. 进程与进程间是相互独立,互不干扰的.但是一个进程中,一个线程挂了,其他线程也可能异常中断.

6. 线程不是越多越好,需要适量.不然调度开销会比较大.

7. 线程与线程间可能会相互干扰,会有线程安全问题.

Java中的多线程

线程是操作系统的概念.操作系统内核中实现了线程这样的概念.且对用户提供了统一的API供用户使用.但是这些API大多是拿C/C++写的.在这个前提下,Java标准库中对操作系统的API进行了进一步的抽象与封装. 在Java中表示线程就是用Thread这个类.

第一个多线程程序

Thread就是Java提供的API.在创建一个类后需要继承Thread,再重写他的run方法.run方法是这个线程的入口. 还需要创建实例,这才是一个线程.最后需要使用start方法,它是真正的在内核中创建了线程.

class MyThread extends Thread {
    @Override
    //run方法就是这个线程的入口方法
    public void run() {
        System.out.println("进去执行啦");
    }
}

public class ThreadDemo {
    public static void main(String[] args) {
        //创建实例 线程实例才是真正的线程
        MyThread myThread = new MyThread();
        //开始执行 调用Thread的start才是真正的调用系统 api,在系统内核中创建线程
        myThread.start();
    }
}

什么是内核

内核就是用来管理管理硬件资源,为软件提供稳定的运行环境.操作系统可以简单的认为是 内核 + 配套的应用程序. 操作系统里面分为内核态和用户态.一般我们的应用程序都是运行在用户态中.但再需要使用硬件资源时,不能直接对硬件资源操作,就需要通过操作系统提供的API进一步在内核中操作.

为什么要划分出内核态和用户态

目的就是为了稳定.为了防止程序把硬件资源,软件资源搞坏了.系统提供的API是合法的.应用程序只能调用这些API,就不会对操作系统或资源造成极大的伤害. 因为在一些极端的情况下程序直接操作硬件可以会将硬件烧坏.

我们可以将操作系统想象成银行,办事窗口是内核区,大厅是用户区.大厅的滑稽需要存钱或者取钱需要通过窗口的工作人员来处理,不能自己直接进去拿.

多线程与普通程序的区别

多线程和普通程序的区别就是每个线程都是一个独立的执行流,他们都是并发执行的,并不是顺序执行代码.

栗子:

class MyThread extends Thread {
    @Override
    public void run() {
        while(true) {
            System.out.println("hello Thread");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }
}
public class ThreadDemo1 {
    public static void main(String[] args) {
        Thread t = new MyThread();
        t.start();
        while(true) {
            System.out.println("hello main");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }

    }
}

通过代码执行打印效果,我们可以发现并不是先打印hello THread在打印 hello main,而是同时执行打印,且是随机的.因为内核中有一个调度器模块.实现方式就是随机调度的效果.

使用jconsole命令观察线程

在本地上找到jbk的bin,再找到jconsole这个可执行文件,双击打不来可以用管理员运行方式打开.

我们可以在线程这一栏中观察我们创建的线程. 


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

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

相关文章

新版画中画documentPictureInPicture API使用

关于该API,chrome dev有一篇比较好入门的文章,如果你没看过强烈推荐你先看这篇基础用法,该文章只针对API的特性和chrome dev文章进行扩展性说明。 提前说明,目前该API是非w3c草案功能,从chrome 116开始已经强推到stabl…

PyQt6运行QTDesigner生成的ui文件程序

2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计18条视频,包括:2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~、第2讲 PyQt6库和工具库Q…

BUUCTF [GXYCTF2019]gakki 1

BUUCTF:https://buuoj.cn/challenges 题目描述: 得到的 flag 请包上 flag{} 提交。 密文: 下载附件,解压得到一张.jpg图片。 解题思路: 1、放到010 Editor中看一下,找到rar压缩包的文件头。使用Kali中的binwalk工具…

【Linux】EVIOCGBIT

EVIOCGBIT(ev, len) 该怎么理解? 我们可以推断出,它是一个宏,它的前两个参数已经确定了,具体的功能由后两个参数(ev,len)来决定。Linux-4.9.88\include\uapi\linux\input.h #define EVIOCGBIT(ev,len) _IOC(_IOC_READ, E, 0x20 …

Linux环境配置Seata开机自启脚本(在MySQL和Nacos启动后启动)

之前给seata配置了一个开机启动脚本,但是经常出现启动失败,查询日志要么MySQL没有连接上要么nacos连接不上,原因都是因为服务器重启的时候这两个服务都还没有完全启动,所以正常的做法应该是启动前先等前置服务启动好了再启动seata…

你知道吗,这些行业的人也是工程师哦

止这些,其工作涉及多种领域,也就是说,有很多细分行业的开发人员也算是电子工程师,下面我们来看看有哪些电子工程师! 1、应用电子工程师 主要负责将电子技术与特定应用相结合,设计并开发满足特定需求的电子…

【教3妹学编程-算法题】二叉树中的伪回文路径

3妹:好冷啊, 冻得瑟瑟发抖啦 2哥 : 又一波寒潮来袭, 外面风吹的呼呼的。 3妹:今天还有雨,2哥上班记得带伞。 2哥 : 好的 3妹:哼,不喜欢冬天,也不喜欢下雨天,要是我会咒语…

常用的Linux的指令

目录 常用指令 1、文件和目录操作: 2、文件查看和编辑 3、系统信息 4、进程管理 5、用户和权限 6、网络操作 7、压缩和解压 8、软件包管理 常用指令 1、文件和目录操作: ls:列出目录内容 cd: 切换目录 pwd:显…

leetcode:随机链表的复制

题目描述 题目链接:138. 随机链表的复制 - 力扣(LeetCode) 题目分析 这个题目很长,但是意思其实很简单:就是一个单链表,每个结点多了一个指针random随机指向链表中的任意结点或者NULL,我们血需…

chatGPT4机器学习数据后最终保留在机器里的是什么? 机器是怎么产生智能的? TensorFlow没有直接开发出类似GPT-4这样的模型

机器学习数据后最终保留在机器里的是机器学习模型。机器学习模型是机器学习系统中的核心,它是机器学习系统能够进行推理和预测的基础。 机器学习模型通常由参数组成。参数是机器学习模型的权重和偏差。机器学习系统通过训练来学习这些参数。训练是指让机器学习系统…

在 Ubuntu 上安装最新版的 Calibre

目录 前言 方法1:从 Ubuntu 的仓库安装 Calibre 卸载 Calibre 方法2:获取最新版本的 Calibre 卸载 Calibre 结语 前言 Calibre 是一款自由开源的电子书软件。下面介绍如何在 Ubuntu Linux 上安装它。 作为电子书管理的瑞士军刀,Calibre …

openEuler 22.03 LTS x86_64 cephadm 部署ceph 16.2.14 未完成 笔记

环境 准备三台虚拟机 10.47.76.94 node-1 10.47.76.95 node-2 10.47.76.96 node-3 下载cephadm [rootnode-1 ~]# yum install cephadm Last metadata expiration check: 0:11:31 ago on Tue 21 Nov 2023 10:00:20 AM CST. Dependencies resolved. Package …

基于opencv+ImageAI+tensorflow的智能动漫人物识别系统——深度学习算法应用(含python、JS、模型源码)+数据集(二)

目录 前言总体设计系统整体结构图系统流程图 运行环境爬虫模型训练实际应用 模块实现1. 数据准备1)爬虫下载原始图片2)手动筛选图片 相关其它博客工程源代码下载其它资料下载 前言 本项目通过爬虫技术获取图片,利用OpenCV库对图像进行处理&a…

荆涛《春节回家》:歌声中的年味与乡愁

荆涛《春节回家》:歌声中的年味与乡愁春节,对于每一个中国人来说,都是一年中最为重要的时刻。它不仅仅是一个节日,更是团圆、乡愁、回忆与希望的象征。歌手荆涛的歌曲《春节回家》恰恰捕捉到了这些情感,用音乐为人们绘…

Leetcode—2824.统计和小于目标的下标对数目【简单】

2023每日刷题&#xff08;三十九&#xff09; Leetcode—2824.统计和小于目标的下标对数目 实现代码 class Solution { public:int countPairs(vector<int>& nums, int target) {int n nums.size();sort(nums.begin(), nums.end());int left 0, right left 1;i…

matlab使用plot画图坐标轴上的导数速度一点和加速度两点如何显示

一、背景 在使用matlab中的plot函数画图时&#xff0c;有时需要在坐标轴上显示一个点的导数项&#xff0c;如横坐标是时间&#xff0c;纵坐标是速度&#xff0c;也就是位置的导数 y ˙ \dot y y˙​&#xff0c;如下图所示&#xff0c;这在matlab如何操作呢&#xff1f; 二…

inBuilder低代码平台新特性推荐-第十期

各位知乎的友友们&#xff0c;大家好~ 今天来给大家带来的是inBuilder低代码平台特性推荐系列第十期——查看变更日志 场景介绍 【销售订单列表】中添加查看变更日志按钮&#xff0c;可以查看列表当前行数据的历史变更记录。 运行时效果 概念 系统中有些关键业务关键数据&am…

基于光纤环形激光器的optisystem仿真及其传感应用

近年来&#xff0c;光纤传感器在航空航天领域&#xff0c;工业制造&#xff0c;医疗等领域引起了越来越多的关注&#xff0c;因为他们体积小&#xff0c;结构简单&#xff0c;灵敏度高&#xff0c;抗电磁干扰强&#xff0c;防腐性能好的特点。各种各样的传感器结构被设计出来&a…

【开源】基于Vue.js的网上药店系统

项目编号&#xff1a; S 062 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S062&#xff0c;文末获取源码。} 项目编号&#xff1a;S062&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 药品类型模块2.3 药…

bugkuctf--Crypto--抄错的字符

抄错的字符 描  述: 老师让小明抄写一段话&#xff0c;结果粗心的小明把部分数字抄成了字母&#xff0c;还因为强迫症把所有字母都换成大写。你能帮小明恢复并解开答案吗&#xff1a;QWIHBLGZZXJSXZNVBZW 这里其实是base64加密只是更换了字母大写&#xff0c;还有数字 QW…