专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

从0开始深入理解并发线程与等待通知机制(上)

  从0开始深入理解并发、线程与等待通知机制(上)进程和线程
  进程:是操作系统进行资源分配的最小单位。一个进程是一个程序的一次执行过程。每启动一个进程,操作系统就会为它分配一块独立的内存空间,用于存储PCB、数据段、程序段等资源。每个进程占有一块独立的内存空间。
  在操作系统没有引入进程之前,由于CPU一次只能执行一个程序,所以多个程序只能顺序执行,而CPU的速度很快,磁盘、网路等IO的速度很慢,造成CPU会有大量空闲的时间,此时CPU的利用率很低,为了解决CPU的利用率低的问题,操作系统引入了进程以及中断处理,实现了在同一时间段内,多个程序的并发执行,这个程序执行一点,那个程序执行一点,这样并发交替的执行大大提高了CPU的利用率。
  线程:线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。面试题:进程之间的通信?
  1:管道,有匿名管道和命名管道。
  当一个进程fork出一个子进程的时候,这时候双方都知道对方存在,具有亲缘关系的两个进程的通信,可以用匿名管道。
  当两个进程没有亲缘关系,就应该用命名管道。
  2:信号,信号分发,用于通知进程有某事发生。
  3:消息队列,就和我们平常用mq差不多,创建一个内存队列,其他进程往这个内存队列发送消息。
  4:共享内存,多个进程访问同一块内存空间。这种方式需要依赖某种操作,比互斥和信号等。
  5:信号量,为了防止出现因多个程序同时访问一个共享资源而引发的一系列问题,我们需要一种方法,它可以通过生成并使用令牌来授权,在任一时刻只能有一个执行线程访问代码的临界区域。临界区域是指执行数据更新的代码需要独占式地执行。而信号量就可以提供这样的一种访问机制,让一个临界区同一时间只有一个线程在访问它,也就是说信号量是用来调协进程对共享资源的访问的。信号量是一个特殊的变量,程序对其访问都是原子操作,且只允许对它进行等待(即P(信号变量))和发送(即V(信号变量))信息操作。最简单的信号量是只能取0和1的变量,这也是信号量最常见的一种形式,叫做二进制信号量。而可以取多个正整数的信号量被称为通用信号量。这里主要讨论二进制信号量。
  6:套接字:socket通信。CPU核心数和线程数的关系
  同一时刻,一个cpu只能运行一个线程。cpu内核和线程同时运行的关系是1:1,inter引入超线程技术后,内核和cpu的关系是1:2,那么在设置最优线程数的时候应该是cpu2。避免cpu不停的上下文切换,也就是我们平常用到最多的设置方式:Runtime。getRuntime()。availableProcessors()2上下文切换
  操作系统将线程或者进程从cpu调度出去的时候,会把当前线程、进程的cache数据保存出去,就比如说CPU寄存器和程序计数器。这个过程叫做上下文切换。它的代价是相对比较大的。引发上下文切换有线程切换,进程切换,系统调用。对一个简单的命令cpu处理,需要大概几个或者几十个时钟周期。上下文切换大概需要500020000个始终周期。synchronized是有锁操作,cas是无锁操作。cas一般来说是比synchronized性能好点,但是不停的cas上下文切换也会浪费性能,导致比synchronized更差。
  这里的CPU寄存器包括:
  程序记数寄存器:跟踪程序执行的准确位置
  堆栈指针寄存器:指示操作栈项
  框架寄存器:指向当前执行的环境
  变量寄存器:指向当前执行环境中第一个本地变量并行和并发
  并发:指应用能够交替执行不同的任务,比如单个cpu下多线程执行并不是同时执行,而是不停的上下文切换这两个任务,以达到‘同时‘执行的效果,只是切换的较快肉眼感觉不到。
  并行:指应用能同时执行不同的任务。比如说两个线程分别由两个不桶的cpu去执行,就叫做并行。创建线程的几种方式
  创建线程:
  从底层代码上看,只有一种,当只有调用Thread类的nativestart0方法内核创建线程然后内核返回来调用run方法。start()JVMStartThreadnewJavaThreados::startthreadrun()
  从java源码注释上说有两种,一种是newThread另一种是实现Runnable方法(Runnable底层也是Threadstart0创建的线程)
  从应用程序,根据不同的需求派生出大概有五种(也有可能多种)方式如下
  方式一:继承于Thread类
  方式二:实现Runnable接口
  方式三:实现Callable接口,Future,RunnableFuture
  方式四:使用线程池
  方式五:使用匿名类
  Thread和Runnable的区别:
  Thread才是Java里对线程的唯一抽象。Runnable是对任务的。Thread可以接受任意一个Runnable实例并执行
  方式一:继承Thread类
  image20230227165501497staticclassThreadTestextendsThread{Overridepublicvoidrun(){System。out。println(继承Thread。currentThread()。getName():正在运行。);}}
  方式二:实现Runnable接口staticclassRunnableTestimplementsRunnable{Overridepublicvoidrun(){System。out。println(实现Runnable。Thread。currentThread()。getName():正在运行。);}}
  方式一和方式二都是没有返回值的。callable是有返回值的
  方式三:实现callable接口staticclassCallableTestimplementsCallable{OverridepublicObjectcall()throwsException{System。out。println(实现callable。Thread。currentThread()。getName():正在运行);return随便返回了;}}publicstaticvoidmain(String〔〕args)throwsException{CallableTestcallableTestnewCallableTest();FutureTaskfutureTasknewFutureTask(callableTest);newThread(futureTask)。start();ObjectofutureTask。get();}
  其实callable底层也是实现了Runnable接口,只不过它callable写了具体的逻辑方法是call(),将call()方法传递给了FutureTask类中,FutureTask类中保存着call方法和实现了Runnable的run方法,还有线程的状态和返回值变量。
  当调用futureTask。get()的时候判断线程是否执行完成并且返回它自己保存的返回值变量。
  如果没有执行完成就调用park。线程的执行是调用了FutureTask实现的run方法,run方法里边调用了call方法,在finally里边调用unpark,也就是把调用get方法的线程unpark掉,并返回值。
  方式四:ExecutorServiceserviceExecutors。newFixedThreadPool(10);service。execute(newThreadTest());service。shutdown();
  方式五:
  其实就是8的特性ThreadthreadnewThread((){System。out。println(111);});
  综上案例真正创建线程还是Thread。run方法。其他的都是衍生品。如何安全的终止线程
  1:代码执行完成
  2:抛出异常
  3:stop(废弃的,但是他不会释放任何资源,比如IO,网卡,锁这些资源不会被释放,占着茅坑不拉屎,当我们在写文件时候,正确打开了io,调用stop后没有调用IO的结束符,导致文件损坏),
  suspend挂起线程(cpu不在执行,只有当有人唤醒它才会继续执行,和stop一样都不会释放资源)
  4:最好的方式是中断,中断信号。调用线程的interrupt,interrupt是jvm中线程类的一个变量。
  当其他线程调用线程A的interrupt的时候只是将线程A这个变量改为true,然后线程A判断isInterrupt判断是否有中断信号,线程A也可以不理会,看心情。
  Thread类中interrupt()、interrupted()和isInterrupted()方法介绍
  interrupt();将线程状态设置成true中断此线程。p线程可以中断自身,这是允许的。在这种情况下,不用进行安全性验证({linkcheckAccess()checkAccess}方法检测)p若当前线程由于wait()方法阻塞,或者由于join()、sleep()方法,然后线程的中断状态将被清除,并且将收到{linkInterruptedException}。p如果线程由于IO操作({linkjava。nio。channels。InterruptibleChannelInterruptibleChannel})阻塞,那么通道channel将会关闭,并且线程的中断状态将被设置,线程将收到一个{linkjava。nio。channels。ClosedByInterruptException}异常。p如果线程由于在{linkjava。nio。channels。Selector}中而阻塞,那么线程的中断状态将会被设置,它将立即从选择操作中返回。该值可能是一个非零值,就像调用选择器的{linkjava。nio。channels。Selectorwakeupakeup}方法一样。p如果上述条件均不成立,则将设置该线程的中断状态。p中断未运行的线程不必产生任何作用。throwsSecurityException如果当前线程无法修改此线程publicvoidinterrupt(){如果调用中断的是线程自身,则不需要进行安全性判断if(this!Thread。currentThread())checkAccess();synchronized(blockerLock){Interruptiblebblocker;if(b!null){interrupt0();只是设置中断标志b。interrupt(this);return;}}interrupt0();}
  interrupted();将线程归为,设置为false
  isInterrupted()返回档期那线程的状态
  优雅的通过线程信号中断线程:
  就是线程A不断的while判断isInterupted()然后做出相应。最后还得interrupted(),将线程归为。
  那么我可以用自定义的变量来代替Interrupt?
  不建议!
  1:Interrupt是jvm源码里边Thread类里的一个变量。是每个线程独有的。
  2:当我们调用Thread。sleep,阻塞队列中take,pull,future。get这些方法是会阻塞的,是被cpu给挂起来了的。那我们自定义的变量是无法中断这些阻塞的。就比如这些方法都会抛出一个中断异常,InterruptExcetion所有的阻塞类的都会抛出这个异常,当阻塞的时候,被别的线程调用interrupt的时候会抛出这个异常,可以快速的相应。自定义的不能快速相应只有当不阻塞的时候才会相应。
  需要补充sleep的时候抛出Interrupt当执行两次start的时候会怎样?
  在调用start方法的时候线程的状态会变化,在执行start的时候会判断这个状态。
  当我们newThread的时候只是在JVM堆里边创建一个内存变量。只有在调用start()start0()方法的时候才会真正的和操作系统的线程挂上钩,才会真正的创建和运行线程,然后这个线程才会执行我们的run方法,start0()JVMStartThreadnewJavaThreados::startthreadrun()。

两网新五大发电的分分合合!2022年12月29日,中国华电官网发文遇见20岁的你致中国华电成立二十周年,浅红色背景海报上标示着大大的20,引用了苏轼定风波中一句何仿吟啸且徐行,下半句配上桃李不言自成蹊作主题GDP房地产和货币2021年,全国商品房销售额大约是18万亿,其中住宅16万亿。2022年,全国商品房销售额大约是13。3亿,其中住宅是11。7亿。数据大概回到了2019年。从GDP比重上来看,房地中信信托总经理芦苇获批,今年信托业新迎4位董事长3位总经理界面新闻记者吴绍志界面新闻编辑信托业处于艰难转型期的同时,掌舵人也加速变更。3月13日,北京银保监局公告,核准芦苇中信信托总经理的任职资格。这意味着,信托一哥正式敲定业务舵手。事实62岁到北京把拉皮手术做了,15天后忍不住吐槽这3件事!以下是求美者自述我这个年纪,脸上有斑点有皱纹很正常,那个时候不像现在这个水那个霜的,防晒霜一辈子没抹过现在生活条件好了,我就想做个手术让自己变年轻一些好看一些。对于这件事,我家里人一年开出43家门店,UR成功逆袭优衣库据快讯,国内快时尚品牌UrbanRevivo去年一共新增43家门店,积极开辟新市场,正在寻求新的机会。去年618期间UR成为天猫女装品牌销售榜第一名,排名第二的是优衣库,ZARA排高叶以前也太土了吧,论穿搭还得看杨幂,比戚薇还会穿人靠衣装马靠鞍,好看的皮囊也需要装扮来加分,有的人在这方面悟性很高,有的人就一直在谷底,很难突破,大嫂高叶以前的穿搭也很土。桃粉色吊带裙,浅灰色长款开衫,原本这一套也可以吸睛的,但风靡全球的创新品类,雨果跨境展览会助你出口可溶性微晶美容贴片3月14日16日,2023CCEE(深圳)雨果跨境全球电商展览会将在深圳福田会展中心举办,助力行业抓住跨境电商发展机遇,共谋产业稳定有序发展!届时,优微生物将携前沿技术最新成果可溶好消息华为官宣新品即将发布3月13日,华为官方微博官宣23日将有P60系列发布,现在一下子就热闹了,终于等到华为的P系列更新迭代了,这是华为的荣耀,也是华粉的盛宴。华为系列一直在影像方面性能卓越,影像高清,老弟问我,RocketMQ中的ProcessQueue怎么理解?今天来分享RocketMQ中一个非常重要又不太好理解的知识点ProcessQueue。一句话概括,ProcessQueue就是MessageQueue的消费快照。看下面这张图1Pr兰州市大数据管理局组织召开招商引资座谈会中国甘肃网3月14日讯(本网记者杨梦园)3月13日,甘肃省政协委员上海辉略企业发展集团有限公司销售总监潘国瑞一行应邀来兰考察调研,兰州市大数据管理局组织召开了招商引资座谈会,市政府3。15打假日,揭露打着基督教幌子的邪教组织持之以恒的3。15打击假冒伪劣活动,对于我国社会经济发展具有重要意义。由此联想到当今的邪教组织,大都假冒合法宗教,蛊人钱财害人性命,威胁着社会稳定和安全,企图建立其神的国,犯下了罄
时装设计师JeremyScott离开了时尚品牌莫斯奇诺,结束十年任期意大利轻奢时尚品牌莫斯奇诺MOSCHINO周一突然发表声明,宣布负责品牌创意十年的创意总监JeremyScott将离职,结束十年任期,品牌将找一位新人,为莫斯奇诺MOSCHINO注90后广东小伙摩旅西藏去藏族姑娘家提亲,被她家狗追了两公里路阅读前先点关注,以便您讨论和分享,感谢您的参与和支持,小静比心这是真实人物故事纪讲述的第11位人物。2023年2月13号,一个90后的广东小伙骑摩托车去西藏旅行,在去西藏的路上认识共青团中央教育部等共同主办!广东工业大学捧回2项金奖,总分全省第13月19日,第十三届挑战杯中国大学生创业计划竞赛全国决赛结果揭晓。广东工业大学选送作品喜获2个金奖3个银奖3个铜奖,并以团体总分全省第一名的成绩再次捧起优胜杯。这是学校自2012年LPL十周年十大选手票选结束第一西卡,小虎第十!近日,官方推出的LPL十周年十大选手评选活动吸引了海量LOL玩家的关注,诸多小伙伴们投票选出自己认为可以入选十大榜单的选手。目前,微博端的投票已经结束,具体排名如下1。SICCA5积分制的弊端,广东同曦新疆排名受影响,同曦队或因此无缘季后赛CBA常规赛已经进行了37轮的比赛,还剩下5轮比赛,而现在各支球队的排名也逐渐明朗,CBA的规则是排名前十二名的球队进入到季后赛,目前来看,前九名的球队进入季后赛都问题不大,152广东三家足球俱乐部完成债务清欠,有望准入新赛季20日下午,中国足协公布了第二批完成债务清欠俱乐部的名单。在这份名单中,此前未能进入第一批名单的三家广东职业足球俱乐部深圳市足球俱乐部广州城足球俱乐部以及广州足球俱乐部均在其中。中伊拉克战争20周年之际,再回首,萨达姆并不仅是输在军事实力上!伊拉克战争已经过去了20年,这场战争的相关人有的已经被埋在了地下有的在安享晚年的退休生活有的深深陷入到自责当中无法逃离。当我们再次翻开这部被多数人快要遗忘掉的历史,其中依然有点点滴A股今日上涨!大阳线或重出江湖!明天(3月22日)行情走势预判今日行情走势较为喜人,截止收盘,不仅上证指数保住了红盘,最终上涨0。64,连创业板也久违的收出一根大阳线,最终大涨1。98!而且两市整体氛围也是涨大于跌的状态,这种行情很多人都很喜兄弟们有这样的会长大家几点上号?最近很火的一款叫龙城天下的游戏里,我们行会的兄弟经常在刷野外副本的时候被其他行会的玩家欺负,有兄弟在行会公屏里诉苦。然后会长知道直接进图里追着那几个喜欢欺负我们兄弟的玩家没错我也被里夫斯能签四年5000万合同!球迷他得的钱比普尔少,但比他强据BleacherReport报道,奥斯汀里夫斯很有可能在这个休赛期,以受限制自由球员的身份,获得一份四年5000万美元的合同,在昨日的生涯之夜,里夫斯全场砍下35分6篮板6助攻拯镇魂街吕布貂灵芸失去鬼王力,夏玲的选择将影响未来世界线貂灵芸氪命过度已经无法使用鬼王力,李轩辕的消失之谜揭晓,夏玲与未来夏玲的选择将影响世界线,哈喽大家好,我是宝岚,镇魂街最新话更新,开幕是霍去病与吕布罢战言和,准备一同对抗红龙大军,
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网