【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 {@Overridepublic 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.hqwc.cn/news/214572.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

每日一题 2824. 统计和小于目标的下标对数目(简单)

简单题&#xff0c;走流程 class Solution:def countPairs(self, nums: List[int], target: int) -> int:ans 0for i in range(len(nums)):for j in range(i 1, len(nums)):if nums[i] nums[j] < target:ans 1return ans

『亚马逊云科技产品测评』活动征文 | uWSGI部署Django

提示&#xff1a;授权声明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 Developer Centre, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道 文章目录 前言一、创建Lightsail实例二、Django环境搭建…

小程序:用户查找英语单词的意思 ← Python字典

【程序分析】 ● 字典中的条目是没有顺序的。 ● 可以对字典使用如下方法&#xff1a; keys()、values()、 items()、 clear()、 get(key)、 pop(key) 和popitem()【程序代码】 dictionary{"dog":"狗","apple":"苹果","banana&q…

【Flink】Standalone运行模式

独立模式是独立运行的&#xff0c;不依赖任何外部的资源管理平台&#xff1b;当然独立也是有代价的&#xff1a;如果资源不足&#xff0c;或者出现故障&#xff0c;没有自动扩展或重分配资源的保证&#xff0c;必须手动处理。所以独立模式一般只用在开发测试或作业非常少的场景…

基于若依的ruoyi-nbcio流程管理系统修改代码生成的sql菜单id修改成递增id(谨慎修改,大并发分布式有弊端)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 1、我看我的原先系统生成的代码id都是很长如下&#xff1a; -- 菜单 SQL insert into sys_menu (menu_id…

海思DEMO板大放送(SCH+PCB)

海思DEMO板大放送&#xff08;SCHPCB&#xff09; 先不多说&#xff0c;上几张硬核图&#xff1a; 关注后台回复关键字获取&#xff0c;根据需要选择&#xff1a; HI3798CV2DMC_VER_C&#xff1a;下载ZZ0001 HI3798CV2DMB_VER_C&#xff1a;下载ZZ0002 HI3518PERB&…

rk3588配置uac功能,android13使能uac及adb的复合设备

最近&#xff0c;因新增需求需要在现有产品上增加UAC的功能&#xff0c;查阅并学习相关知识后&#xff0c;在rk3588 SOC硬件平台搭载android13系统平台上成功配置了uac及uac&adb的复合设备。基于开源共享精神希望给大家提供些参考。 1.技术可行性预研 &#xff08;1&#…

UI自动化测试神器:RunnerGo测试平台

可以直接进入官网下载开源版或点击右上角体验企业版体验 RunnerGo UI自动化平台 RunnerGo提供从API管理到API性能再到可视化的API自动化、UI自动化测试功能模块&#xff0c;覆盖了整个产品测试周期。 RunnerGo UI自动化基于Selenium浏览器自动化方案构建&#xff0c;内嵌高度…

线上问题排查实例分析|关于 Redis 内存泄漏

Redis 作为高性能的 key-value 内存型数据库&#xff0c;普遍使用在对性能要求较高的系统中&#xff0c;同时也是滴滴内部的内存使用大户。本文从 KV 团队对线上 Redis 内存泄漏定位的时间线维度&#xff0c;简要介绍 Linux 上内存泄漏的问题定位思路和工具。 16:30 问题暴露 业…

数据结构:二叉查找树,平衡二叉树AVLTree,红黑树RBTree,平衡多路查找数B-Tree,B+Tree

二叉查找树 二叉树具有以下性质&#xff1a;左子树的键值小于根的键值&#xff0c;右子树的键值大于根的键值。 对该二叉树的节点进行查找发现深度为1的节点的查找次数为1&#xff0c;深度为2的查找次数为2&#xff0c;深度为n的节点的查找次数为n&#xff0c;因此其平均查找次…

探索移动端可能性:Capacitor5.5.1和vue2在Android studio中精细融合

介绍&#xff1a; 移动应用开发是日益复杂的任务&#xff0c;本文将带领您深入探索如何无缝集成Capacitor5.5.1、Vue2和Android Studio&#xff0c;以加速您的开发流程Capacitor 是一个用于构建跨平台移动应用程序的开源框架。Vue 是一个流行的 JavaScript 框架&#xff0c;用…

无需外接显示器,直接使用windows安装树莓派系统并可远程桌面登录

准备工作: 1.安装树莓派官方烧录工具 raspberry pi imager 2.下载树莓派系统镜像(也可选择在线下载安装) 打开imager工具&#xff0c;选择需要安装包树莓派版本 点击"NEXT"&#xff0c;在弹出的选项中选择编辑设置。 设置登录名和密码&#xff0c;已经所连接的wif…