【JavaEE】认识多线程

news2024/10/7 9:22:59

作者主页: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这个可执行文件,双击打不来可以用管理员运行方式打开.

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


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

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

相关文章

葡萄采收时节分类,其中大有学问

葡萄在酿造葡萄酒的时候有一个关键的因素那就是葡萄的采收期,符合采收时节的葡萄大部分属于成熟好的葡萄,那么,云仓酒庄的品牌雷盛红酒分享这样的葡萄酿出来的酒自然优质。正是因为采收时分不同,根据采摘的不同,给不同…

Elasticsearch知识

目录 Elasticsearch逻辑设计和物理设计 逻辑设计物理设计Elasticsearch原理 倒排索引文档的分析过程保存文档搜索文档写数据的底层原理 数据刷新(fresh)事务日志的写入ES在大数据量下的性能优化 文件系统缓存优化数据预热文档(Document&…

Java计算两个时间的相差年,日,小时,分,秒

主函数 public static int dateDiff(char flag, Calendar calSrc, Calendar calDes) {long millisDiff getMillis(calSrc) - getMillis(calDes);if (flag y) {return (calSrc.get(Calendar.YEAR) - calDes.get(Calendar.YEAR));}if (flag d) {return (int) (millisDiff / D…

FANUC机器人到达某个点位时,为什么不显示@符号?

FANUC机器人到达某个点位时,为什么不显示@符号? 该功能由变量$MNDSP_POSCF = 0(不显示)/1(显示)/2(光标移动该行显示) 控制,该变量设置为不同的值,则启用对应的功能。 如下图所示,为该变量设置不同的值时的对比, 其他常用的系统变量可参考以下内容: 在R寄存器指定速度…

NX二次开发UF_CSYS_map_point 函数介绍

文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan UF_CSYS_map_point Defined in: uf_csys.h int UF_CSYS_map_point(int input_csys, double input_point [ 3 ] , int output_csys, double output_point [ 3 ] ) overview 概述 Ma…

小白一文搞懂正则表达式

大学的时候学过,没搞明白,工作的时候学了几次,还是懵逼的状态,写篇入门文字记录下如何快速搞懂正则表达式 首先写几个常用的正则表达式: 1.匹配手机号 1[34578]\d{9} 2.QQ号,第一位不能是0,5位…

如何用Python+Appium实现精准元素定位?教你拥有高效自动化测试技能!

在使用appium做app自动化测试的过程中,可能会遇到元素的属性值不是唯一的情况,导致不能通过find_element_bi_xx()方法定位元素,这个时候我们就可以通过坐标来定位元素。 1,通过绝对坐标定位(不推荐) 在手…

【数据分享】2023年我国省市县三级的瞪羚企业数量(免费获取/Excel/Shp格式)

企业是经济活动的参与主体。一个城市的企业数量决定了这个城市的经济发展水平!比如一个城市的金融企业较多,那这个城市的金融产业肯定比较发达;一个城市的制造业企业较多,那这个城市的制造业肯定比较发达。 之前我们给大家分享了…

【采坑分享】导出文件流responseType:“blob“如何提示报错信息

目录 前言: 采坑之路 总结: 前言: 近日,项目中踩了一个坑分享一下经验,也避免下次遇到方便解决。项目基于vue2axioselement-ui,业务中导出按钮需要直接下载接口中的文件流。正常是没有问题,但…

【分布式】分布式中的时钟

一、物理时钟 vs 逻辑时钟 时钟的存在主要是为了标识事件的发生顺序。 分布式系统不使用物理时钟记录事件,分布式系统中每个节点记录的时间并不一样,即使设置了 NTP 时间同步节点间也存在毫秒级别的偏差 所以需要有另外的方法记录事件顺序关系&#x…

Spring Web MVC

目录 一.简介 二.建立连接(客户端和服务器) 三.请求 1.传递单个参数 2.传递多个参数 3.对象 4.数组/集合 5.JSON 6.URL参数 7.上传文件 8.获取cookie和session (1)获取cookie (2)获取session …

【学习笔记】GameFramework的非官方实例TowerDefense-GameFramework-Demo的流程

一、从游戏开始到打开一个Menu GameStart.unity GameEntry.Builtin.cs ProcedureComponent.cs GameStart.unity->GameFramework->Builtin->Procedure ProcedureLaunch.cs ProcedureSplash.cs ProcedurePreload.cs ProcedureLoadingScene.cs DataTables/Scene.txt Pro…

Table和HashBasedTable的使用案例

------------------- 1.普通使用 package org.example.testhashbasedtable;import com.google.common.collect.HashBasedTable; import com.google.common.collect.Table;import java.util.Map;public class TestHashBasedTable {public static void main(String[] args) {Ta…

17 redis集群方案

1、RedisCluster分布式集群解决方案 为了解决单机内存,并发等瓶颈,可使用此方案解决问题. Redis-cluster是一种服务器Sharding技术,Redis3.0以后版本正式提供支持。 这里的集群是指多主多从,不是一主多从。 2、redis集群的目标…

2023年APMCM亚太杯数学建模竞赛A题思路解析

2023年APMCM亚太赛 A 题: 果实采摘机器人的图像识别 Image Recognition for Fruit-Picking Robots 【请电脑打开本文链接,扫描下方名片中二维码,获取更多资料】 翻译 中国是世界上最大的苹果生产国,年产量约为3500万吨。与此同…

vscode项目推送到git

1、打开项目文件 打开文件后点击vs code左侧工具栏中第三个源代码管理图标,点击初始化仓库,此时会创建一个本地仓库会检查该项目中的文件变更 2、创建远程仓库 点击克隆/下载,复制HTTPS地址 3、添加远程地址 1)图形化操作 2…

【Clang Static Analyzer 代码静态检测工具详细使用教程】

Clang Static Analyzer sudo apt-get install clang-tools scan-build cmake .. scan-build make -j4 编译完成之后会在终端提示在哪里查看报错文档: scan-build: 55 bugs found. scan-build: Run scan-view /tmp/scan-build-2023-11-24-150637-6472-1 to examine bug report…

【Python接口自动化测试】HTTP协议基础详解

前言 了解HTTP协议是做好接口测试的前提与基础。 其中,HTTP与HTTPS有什么区别,HTTP协议与TCP/IP协议分别属于OSI七层模型中的哪一层,这在面试过程中也会经常问到。 HTTP简介 HTTP 即 HyperText Transfer Protocol(超文本传输协…

vue中下载文件后无法打开的坑

今天在项目开发的时候临时要添加个导出功能我就写了一份请求加导出得代码, 代码: //导出按钮放开exportDutySummarizing (dataRangeInfo) {const params {departmentName: dataRangeInfo.name,departmentQode: dataRangeInfo.qode}//拼接所需得urlcons…

农田气象要素监测仪助力农业发展

随着科技的不断进步,现代农业已经越来越离不开科学技术的支持。其中,WX-NY12 农田气象要素监测仪成为了现代农业中不可或缺的一部分。这款仪器能够实时监测农田中的气象要素,如温度、湿度、光照、风速等,为农民提供更加精准的农业…