对线程、进程和Java线程池的理解

        人生最大的悲哀,莫过于我本可以。

        我钻研操作系统,后选修Linux操作系统,做过父进程生子进程的作业,还做过IO多路复用、多线程的网络游戏,自认为对线程、进程的理解颇深。

        然,多次面试,面对面试官:“你对Java的线程池机制有所了解吗?”

        我不由噤声。

        面试官再问:“你说一说进程与线程的区别。”

        我更是大惊失色,支支吾吾,拾了一些“进程不共享资源”、“进程对应多个线程”、“线程是执行最小单位”、“一个进程至少一个线程”来答,看着面试官越来越失望的脸色,我自知面试必挂。

        苦也!

进程:

        进程是操作系统最重要的四个概念之一,另外三个分别是线程、进程调度、IPC进程通信。

        1.定义:进程是运行中的程序。程序可以认为是一段数据,其没什么意义,只有跑起来才能工作。

        2.1号进程:最初始的进程,所有进程都是基于它的基础上创建的,如果某个进程的父进程结束了,会托管给它。【没错,进程是靠父进程生出来的】

        3.当前工作目录:一个进程的运行,可能需要5、6个变量,而硬盘中可能有几千个变量,如果全部加载进内存,内存不够用,所以得有选择地加载变量。用什么区别变量呢?就是当前工作目录working directory。简单地说,你下载了Java后,为什么要修改系统变量,添加bin目录?明明cmd语句,在java的bin目录下完全可以运行java程序。就是因为,添加进系统变量后,运用起来非常方便,否则你打开IDE,还得自己配置环境变量。

                这是非常重要的概念,命令pwd可以打印出来,在编写程序时,用getcwd也可以得到。【目录的本质也是一个文件,其文件结构是一条一条的,用read读出来能发现其信息包括文件ID、name啥啥啥的】

        4.一些进程举例:除了我们自己写了并运行的进程,操作系统还为我们提供原生进程(也是下载过来的),比如Linux的命令ls,其本质也是一个进程,如果我们在运行结束后,用echo $?命令,打印返回值,甚至能得到一个0。或者cat命令,如果打印一个不存在的文件null,cat  null,然后用echo $?打印返回值,会出现!0(非0)的数。

        5.c语言创建进程:有两步,第一个是fork复制一个子进程,第二步是用exec函数族(一般用execl,比较简单)替换进程。【什么意思呢?我们知道,进程是由父进程生出来的,那么生进程怎么做到?】

                我们知道,fork函数可以创建一个子进程,这个进程和父进程一模一样,从fork语句后执行一样的语句,不过fork的子进程、父进程返回值不一样,返回0的是子进程,!0(非0,子进程ID)的是父进程,就此区别父子进程。

                我们一般用子进程替换成别的进程(当然,替换后它仍然是子进程,关系不会变),用excel函数,提供参数(path, args)即可,举例:

                excel("/usr/bin/ls", "ls");【注意,CMD命令,第一个参数是其自身】

                你写下这行语句,如果将进程运行在后台(用&),就会发现终端竟然打印了当前工作目录下的所有文件。

        6.进程创建消耗的资源:创建一个进程,意味着要给它分配堆栈、数据段的资源。

        7.进程间通信,7种常用方式:套接字socket(没错,就是网络编程的套接字,网络编程实际就是两个进程的通信)、共享内存、消息队列、信号量(常处理并发问题)、信号(ctrl+z杀死进程)、管道、命名管道(区别是命名管道,可用于与父子血缘关系的进程通信)

        8.进程安全性:一个进程的崩溃、销毁、创建,一般不会影响到其它进程的正常生命周期。

        9.进程和线程的关系:一个进程至少对应一个线程,因为进程只是资源分配的最小单元,不是执行的最小单元。

线程:

        1.定义:把它看成一条从上到下的时间线,对于下面的代码段,线程就是a->b->c,我是这么理解的。

a;
b;
c;

        2.线程创建消耗的资源:一般只有堆栈,数据段的资源默认共享。【不过,当出现某些变化时,可能会创建新资源】

        3.C进程的创建:需要使用到pthread库函数,有声明、创建两个基础操作(pthread_t pname; pthread_create(&pname, NULL, 函数名, NULL【变量】);一般函数名运行完毕后线程就会销毁。

        4.Java线程的创建:常用两种继承Thread、实现Runnable,不过,在调用时,都得使用Thread类实例的start方法。实现线程的方法,都在Run方法中写。

        5.线程的安全性:线程一旦遇到错误崩溃,大概率会使整个进程崩溃。

Java线程池机制:

        1.池化思想:在使用前为你创建好实例,在你使用后放回池内,不销毁。在使用时,节省了创建、销毁的步骤,节约时间。

        2.线程池的理解:如果你是A银行行长,A银行有10个柜台,为了保持工作通畅、效率高、并尽量节约人力资源,你会怎么做?

                假设,如果每天5个人轻松应对,

                1.行为(线程池初始化):就安排5个服务员,应对这些客户即可。

                问题1st:如果有更多的客人来了,怎么办?

                2.行为(增加线程数):很简单,多出来几个,我安排几个柜台,比如6个人来了,那我再开一个柜台。【切记,开一个柜台,就得打电话叫服务员从家过来,消耗时间很多】

                问题2nd:不仅有1st问题,客户的数目也不是固定的,可能10点来了6个,11点就只有3个。

                行为2的弊端:开柜台的效率太低了,等到服务员从家过来,前5个柜台说不定已经有空余柜台了,不可取。

                3.行为(等待队列):干脆提供一个休息区(等待队列),所有多出来的客户,先进去等待一下。

                问题3rd:问题好像解决了,不过如果100个客户过来,95个人在休息区等待,明显也不行啊?

                4.行为:所以,需要平衡休息区,这个要看情况,如果服务员处理速度很快,那休息区大点没关系,如果比较慢,休息区就小一点。【因为休息区也占用资源】

                问题4th:照样是100个客户过来,5个柜台实在应付不过来。

                5.行为(增加线程数):干脆把另外5个柜台也开了,从家过来慢点就慢点,总好过一直让客户等着。

                问题5th:200个客户过来了,队伍已经排到银行外面了,你想着,如果要办理这些业务,起码要做到明天。

                6.行为(拒绝策略):要不增加人手(明显柜台数固定)、要不叫客户去别的地方办理、要不干脆让他们回家明天再来【当然,Java提供第4种机制,把最先进入等待区的客户赶出去,让新客户进来,我实在不能理解】

                当然,如果处理完一波大的客流(比如中午总是有100个人来,其他时间就2、3个),我们也得学会利用人力资源,在中午时多开几个柜台,之后关闭几个柜台。【超时策略】

        3.线程池7个参数:就此,我们把Java线程池的6个参数都覆盖了,另外一个是构造线程池方式。【核心线程数、最大线程数、超时时间、超时时间单位、等待队列、线程池构造工厂、拒绝策略】

        4.Java线程池的相关类,都放在java.util.concurrent包下,使用举例:

public static void main(String[] args) {
        ExecutorService executor = new ThreadPoolExecutor(3, 5,
             1, TimeUnit.SECONDS, new ArrayBlockingQueue<>(3), Executors.defaultThreadFactory());

        for(int i=0; i<100; i++){
            executor.execute(new Thread(new Runnable() {
                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    System.out.println(Thread.currentThread().getName()+"->正在执行!");
                }
            }));
        }

        executor.shutdown();
    }

以上内容即我想分享的关于线程、进程、Java线程池的一些知识。

        我是蚊子码农,如有补充,欢迎在评论区留言。个人也是初学者,知识体系可能没有那么完善,希望各位多多指正,谢谢大家。

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

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

相关文章

《QT实用小工具·三十一》基于QT开发的访客管理平台demo2

1、概述 源码放在文章末尾 该项目为访客管理平台demo&#xff0c;包含主界面、系统设置、警情查询、调试帮助、用户退出功能。 项目部分代码如下&#xff1a; #pragma execution_character_set("utf-8")#include "frmmain.h" #include "ui_frmmain…

SpringBoot + Redis实现用户信息登录的缓存

&#x1f34e;前言 &#x1f350;项目的背景 背景&#xff1a;&#x1f349;当我们在完成用户信息登录时&#xff0c;我们往往每次都会在数据库中查询用户的记录&#xff0c;生成token并返回给前端&#xff0c;不过这样会有一定的问题。 &#x1f350;造成的问题 问题&#xf…

Linux 用户和组

理解Linux 用户和组的概念 掌握passwd 文件的组成以及作用 掌握shadow 文件的组成以及作用 了解group 文件的内容 1.用户分类&#xff1a; 超级管理员&#xff08;root&#xff09; 普通用户 程序用户 1.用户信息文件 /etc/passwd 文件中存储了所有用户信息。 1.passwd 格…

python中中英文打印对齐解决方案

在python中&#xff0c;有时候会出现中英文混合输出的情形&#xff0c;但是由于中文默认是全角格式&#xff08;一个中文字符占用两个字符宽度&#xff09;&#xff0c;这会对python原生的print函数带来一些障碍。尤其是用户用print对齐输出的时候&#xff0c;这种差异会导致文…

月球地形数据介绍(LOLA)

月球地形数据介绍 LOLA介绍LOLA数据的处理与发布数据类型和格式投影坐标系SIMPLE CYLINDRICALPOLAR STEREOGRAPHIC 数据下载与浏览 LOLA介绍 目前最新的月球地形高程数据来源于美国2009年发射的LRO探测器。 “月球勘测轨道器”(Lunar Reconnaissance Orbiter&#xff0c;LRO)…

文心一言 VS 讯飞星火 VS chatgpt (240)-- 算法导论17.3 6题

六、证明&#xff1a;如何用两个普通的栈实现一个队列(练习10.1-6)&#xff0c;使得每个 ENQUEUE 和 DEQUEUE 操作的摊还代价为 O(1) 。练习10.1-6的内容是&#xff1a;说明如何用两个栈实现一个队列&#xff0c;并分析相关队列操作的运行时间。如果要写代码&#xff0c;请用go…

【MIT6.824】lab2C-persistence, lab2D-log compaction 实现笔记

引言 lab2C的实验要求如下 Complete the functions persist() and readPersist() in raft.go by adding code to save and restore persistent state. You will need to encode (or “serialize”) the state as an array of bytes in order to pass it to the Persister. Us…

el-table使用show-summary合计,但只需要合并某一列

el-table使用show-summary合计&#xff0c;但只需要合并某一列 这里有两种方法&#xff0c;一种是网上的&#xff0c;我会引用他的链接给你们看。 一种是我自己看源码发现的 方法一 这个就是方法一的链接 点击我跳转方法一 方法二 不需要计算的列 去掉prop 然后用插槽显示即可…

比特币叙事大转向

作者&#xff1a;David Lawant 编译&#xff1a;秦晋 要理比特币解减半动态&#xff0c;最关键的图表是下面这张&#xff0c;而不是价格图表。它显示了自 2012 年以来&#xff0c;矿业总收入与比特币现货交易量的比例&#xff0c;并标注了三个减半日期。 虽然矿工仍然是比特币生…

Python八股文:基础知识Part2

1. Python中变量的保存和访问 Python中的变量实际上是一个指向对象的引用&#xff0c;每个对象都有一个唯一的标识符&#xff08;即内存地址&#xff09;。对于一些不可变对象&#xff0c;如字符串和整数&#xff0c;因为它们的值不可更改&#xff0c;所以当多个变量引用相同的…

OSPF大型实验

OSPF大型实验 实验拓扑图 实验思路 1、R4为ISP&#xff0c;其上只配置IP地址&#xff1b;R4与其他所直连设备间均使用公有IP&#xff1b; 2、R3-R5、R6、R7为MGRE环境&#xff0c;R3为中心站点&#xff1b; 3、整个OSPF环境IP基于172.16.0.0/16划分&#xff1b;除了R12有两…

Java精品项目--第8期基于SpringBoot的宠物用品商城的设计分析与实现

项目使用技术栈 SpringBootThymeleafMyBatisMySQLAopJavajdk1.8 项目介绍 项目截图

JAVA 集合框架(一) Collection集合详解和常用方法

Java集合框架&#xff08;Java Collections Framework&#xff09;是一个强大的、高度灵活的数据结构库&#xff0c;它为Java应用程序提供了组织、存储和操作对象集合的标准方法。 集合类体系结构 接口类&#xff1a; Collection: 是单例集合类的顶层接口&#xff0c;包括Lis…

移动端适配之viewport

目录 盒模型&#xff1a;widthcontent&#xff08;padding border&#xff09; class"content-box"内容盒模型&#xff08;W3C盒&#xff09; class"border-box"边框盒模型&#xff08;IE 盒&#xff09; scroll滚动 window浏览器视窗&#xff1a;包括…

MySQL高级(索引-性能分析-explain执行计划)

explain 或者 desc 命令获取 MySQL 如何执行 select 语句的信息&#xff0c;包括在 select 语句执行过程中表如何连接和连接的顺序。 -- 直接在 select 语句之前加上关键字 explain / desc explain select 字段列表 from 表名 where 条件 &#xff1b; explain select * …

自养号测评:如何提高国际站,敦煌网的店铺销量?

随着互联网技术的迅猛进步&#xff0c;电子商务已经成为现代商业领域中不可或缺的一环。敦煌网&#xff0c;作为专注于中国文化艺术产品的电商平台&#xff0c;成功吸引了大量消费者的目光。然而&#xff0c;对于商家而言&#xff0c;如何进一步提升敦煌网的销售业绩&#xff0…

用这些工具搭建企业内部知识库,原来这么轻松

在快速发展和信息爆炸的时代&#xff0c;为企业构建一个内部知识库变得十分重要。它不仅有助于保存关键信息&#xff0c;促进知识传承&#xff0c;还能提高企业的整体效率和响应能力。今天&#xff0c;我们将探讨三款非常适合搭建企业内部知识库的工具&#xff0c;它们各具特色…

Python教学入门:流程控制

条件语句&#xff08;if 语句&#xff09;&#xff1a; 条件语句用于根据条件的真假执行不同的代码块。 x 10if x > 0: # 如果 x 大于 0print("x 是正数") # 输出&#xff1a;x 是正数 elif x 0: # 如果 x 等于 0print("x 是零") else: # 如果以…

第07-1章 计算机网络相关概念

7.1 本章目标 了解网络协议的概念了解网络体系结构熟悉ISO/OSI参考模型以及每一层的功能掌握TCP/IP模型各层的主要协议及其功能熟练掌握IP地址、子网规划等相关内容 7.2 网络协议的概念 7.2.1 概念介绍 &#xff08;1&#xff09;网络协议&#xff1a;计算机网络和分布系统中…

Java 笔试强训篇- Day1

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 点击消除 1.1 解题思路一 1.2 解题思路二 2.0 在两个数组中找出相同的数 2.1 解题思路 笔试强训说明&#xff1a;有一些题目提供不了原题。 1.0 点击消除 该题链…
最新文章