范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

从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,那么在设置最优线程数的时候应该是cpu*2。避免cpu不停的上下文切换,也就是我们平常用到最多的设置方式:Runtime.getRuntime().availableProcessors()*2 上下文切换
  操作系统将线程或者进程从cpu调度出去的时候,会把当前线程、进程的cache数据保存出去,就比如说CPU寄存器和程序计数器。这个过程叫做上下文切换。它的代价是相对比较大的。引发上下文切换有线程切换,进程切换,系统调用… …。对一个简单的命令cpu处理,需要大概几个或者几十个时钟周期。上下文切换大概需要5000 - 20000个始终周期。synchronized是有锁操作,cas是无锁操作。cas一般来说是比synchronized性能好点,但是不停的cas上下文切换也会浪费性能,导致比synchronized更差。
  这里的CPU寄存器包括:
  程序记数寄存器:跟踪程序执行的准确位置
  堆栈指针寄存器:指示操作栈项
  框架寄存器:指向当前执行的环境
  变量寄存器:指向当前执行环境中第一个本地变量 并行和并发
  并发 :指应用能够交替执行不同的任务,比如单个cpu下多线程执行并不是同时执行,而是不停的上下文切换这两个任务,以达到‘同时‘执行的效果,只是切换的较快肉眼感觉不到。
  并行 :指应用能同时执行不同的任务。比如说两个线程分别由两个不桶的cpu去执行,就叫做并行。 创建线程的几种方式
  创建线程:
  从底层代码上看,只有一种,当只有调用Thread类的native start0方法内核创建线程然后内核返回来调用run方法。start()->JVM_StartThread -> new JavaThread->os::start_thread -> run()
  从java源码注释上说有两种,一种是new Thread另一种是实现Runnable方法(Runnable底层也是Thread start0创建的线程)
  从应用程序,根据不同的需求派生出大概有五种(也有可能多种)方式如下
  方式一:继承于Thread类
  方式二:实现Runnable接口
  方式三:实现Callable接口,Future,RunnableFuture
  方式四:使用线程池
  方式五:使用匿名类
  Thread和Runnable的区别 :
  Thread才是Java里对线程的唯一抽象。Runnable是对任务的。Thread可以接受任意一个Runnable实例并执行
  方式一 :继承Thread类
  image-20230227165501497 static class ThreadTest extends Thread{     @Override      public void run(){        System.out.println("继承Thread。"+currentThread().getName()+":正在运行。");      }  }
  方式二:实现Runnable接口 static class RunnableTest implements Runnable{     @Override     public void run() {         System.out.println("实现Runnable。"+Thread.currentThread().getName()+":正在运行。");     } }
  方式一和方式二都是没有返回值的。callable是有返回值的
  方式三:实现callable接口 static class CallableTest implements Callable {      @Override      public Object call() throws Exception {        System.out.println("实现callable。" + Thread.currentThread().getName() + ":正在运行");        return "随便返回了";     } } public static void main(String[] args) throws Exception {       CallableTest callableTest = new CallableTest();       FutureTask futureTask = new FutureTask(callableTest);       new Thread(futureTask).start();      Object o = futureTask.get();   }
  其实callable底层也是实现了Runnable接口,只不过它callable写了具体的逻辑方法是call(),将call()方法传递给了FutureTask类中,FutureTask类中保存着call方法和实现了Runnable的run方法,还有线程的状态和返回值变量。
  当调用futureTask.get()的时候判断线程是否执行完成并且返回它自己保存的返回值变量。
  如果没有执行完成就调用park。线程的执行是调用了FutureTask实现的run方法,run方法里边调用了call方法,在finally里边调用unpark,也就是把调用get方法的线程unpark掉,并返回值。
  方式四: ExecutorService service = Executors.newFixedThreadPool(10); service.execute(new ThreadTest()); service.shutdown();
  方式五:
  其实就是8的特性 Thread thread = new Thread(()->{     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 /**  * 中断此线程。  * 

线程可以中断自身,这是允许的。在这种情况下,不用进行安全性验证({@link #checkAccess() checkAccess} 方法检测) *

若当前线程由于 wait() 方法阻塞,或者由于join()、sleep()方法,然后线程的中断状态将被清除,并且将收到 {@link InterruptedException}。 *

如果线程由于 IO操作({@link java.nio.channels.InterruptibleChannel InterruptibleChannel})阻塞,那么通道 channel 将会关闭, * 并且线程的中断状态将被设置,线程将收到一个 {@link java.nio.channels.ClosedByInterruptException} 异常。 *

如果线程由于在 {@link java.nio.channels.Selector} 中而阻塞,那么线程的中断状态将会被设置,它将立即从选择操作中返回。 *该值可能是一个非零值,就像调用选择器的{@link java.nio.channels.Selector#wakeupakeup}方法一样。 * *

如果上述条件均不成立,则将设置该线程的中断状态。 *

中断未运行的线程不必产生任何作用。 * @throws SecurityException 如果当前线程无法修改此线程 */ public void interrupt() { //如果调用中断的是线程自身,则不需要进行安全性判断 if (this != Thread.currentThread()) checkAccess(); synchronized (blockerLock) { Interruptible b = blocker; 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的时候会判断这个状态。   当我们new Thread的时候只是在JVM堆里边创建一个内存变量。只有在调用start()->start0()方法的时候才会真正的和操作系统的线程挂上钩,才会真正的创建和运行线程,然后这个线程才会执行我们的run方法,start0()->JVM_StartThread -> new JavaThread->os::start_thread -> run()。


产前应该准备什么产前需要准备什么?过来人告诉你待产包带好这几样关键的,肯定用得到随着预产期的临近,不少的准妈妈陆陆续续住进了医院,对于第一次生产的准妈妈来说,最容易出现忘记带东西的情况,本就处于预造车新势力公布3月销量,本轮价格战影响几何?今年3月,国内车市出现了史无前例的价格战,其中既有传统燃油车企,也有造车新势力车企。然而中国汽车流通协会此前指出,这次的补贴造成广大消费者持币待购,并没有起到促销效果。4月1日,造王传福预计今年国内新能源汽车销量达850万900万台4月1日,比亚迪股份有限公司董事长兼总裁王传福在中国电动汽车百人会论坛上发表了题为坚定拥抱电动化浪潮,加快推进中国汽车产业现代化的演讲。王传福表示,我国新能源汽车站在了双碳的风口,ViVOX90降价660元!12256G仅售3825,挑战高端旗舰手机最低价2022年11月,蓝厂发布了高端影像旗舰ViVOX90,不管是配置定价还是外观,ViVO都拿出极大的诚意,仿佛在这个日渐卷起的国产手机市场,ViVO也不再是以前那个高价低配的代表了AI绘画美学(21),春季毛衣的诱惑与风情春天来了,温柔又甜美的穿搭,必然是姑娘们最喜欢的风格呀。软软糯糯的毛衣,穿起来舒适又温柔,谁能不喜欢呢?相对于挺括的西装外套,或者帅气的风衣外套。毛衣才是更具女性魅力的单品呀,它舒谁说黑白镜头已过时?7年后再看华为P9拍照我依然会给它满分文未来派对FutureParty2023年各大手机品牌都开始发力影像,不管是华为P60Pro三星S23UltraiPhone14PM还是OPPOFindX6Pro都展现了自己足够强第二代骁龙8赋能MEIZU20系列实现全方位无界体验日前,魅族正式发布全新旗舰MEIZU20系列。MEIZU20系列全系搭载第二代骁龙8移动平台,在性能游戏影像连接等多领域为用户带来全新体验。MEIZU20系列包括无界美学MEIZU85寸电视哪款性价比高?口碑最好的是这五款,千万别被忽悠了85寸电视哪款性价比最高?85寸电视,虽说大家都在说电视屏幕越大越好,大家可别乱买。首先还是根据家里的实际情况决定。85寸电视的对角线长度在2。16米,长1。88米,宽1。06米,爆火遭疯抢的茅台1935,为何现在少人问津?酒友3点是关键虽然我国名酒千千万,但要说最受追捧的,非茅台莫属。作为公认的业界神话,自茅台登上顶峰后,始终在高端市场稳坐第一,它推出的各种产品,不管怎样都有无数人为之买单。网上曾经有这样一个问题烙糖饼时,面水比例很重要,教你详细配方,大饼比棉花糖还要松软烙糖饼时,面水比例很重要,教你详细配方,大饼比棉花糖还要松软。经常听大家说,在餐馆里吃到的那种又酥又软的糖饼,在家怎么也做不好。今天我们就来做糖饼,做出来的小糖饼软得不像话,保存好冲上热搜!网友请放过咖啡吧这几天有一个热搜,让爱吃章鱼和爱喝咖啡的都沉默了有网友发帖称,厦门一家咖啡厅推出章鱼拿铁咖啡。有网友紧急呼叫厦门的朋友我急需你帮我解答一下这个厦门风味我大受震撼那个章鱼啊,泡在咖啡
如何用纳米粒度仪,进行外泌体浓度表征检测?对于外泌体(Exosome)的表征,大家最为关注的想必都是它的粒径了,但其实外泌体的浓度参数也同样重要,因为浓度不同,外泌体样品最终表现出的具体功效和能力都会有不小的差别。浓度过高老爸商城怎么选品,3个案例告诉你从最初仅有几十款产品,到如今2000款左右的商品供给从2017年上线的老爸评测淘宝会员店,到如今老爸商城小程序,经过多年积淀,老爸商城有了自己独有的选品逻辑。老爸商城的一款商品从提大疆Mini3曝光!配置几乎与Mini3Pro相同?售价也会更便宜?2022年5月的时候,大疆发布了旗下全新的Mini系列无人机DJIMini3Pro,从命名上看,我们就知道这款无人机的定位了,DJIMini3Pro延续了这个系列的传统,那就是轻,同是四核八线程的CPUX5560和E31230V2价格为何相差如此之大导读志强系列的处理器大家都知道,这玩意除了E3系列基本上都是用在服务器上面的,E3之前也是用在服务器上面的,只不过Intel给它设计了一个消费级主板能用的针脚,这也就导致了现在很多标准贡献奖获奖人中国电信夏旭一位担当实干的移动通信标准建设领路人矩不正,不可为方规不正,不可为圆。标准是产业发展的基础,也是各领域互通的前提。跨入5G时代后,越来越多的新技术新挑战也把对标准的要求推向了新高度。作为具有全球影响力的通信电信运营商2022年11月亚洲(中国)酒店业发展报告本文来自微信公众号空间秘探(IDMESPACE007),作者ABNData。11月亚洲(中国)酒店综述01全球酒店业发展动态11月,中东酒店市场因世界杯的到来出现消费翻倍增长。,1俄罗斯美女在中国边境小城卖力赚钱,直言中国更像老家?众所周知,俄罗斯女性们都有着金发碧眼,高挑性感的身材。正是由于俄罗斯当地有着遍地如云的美女们,这里也就成为了我国多数男性游客们出国旅游的首选地了。(此处已添加小程序,请到今日头条客再获浦发光大等多家银行支持碧桂园已与十家银行开启战略合作融资迎利好年底气温持续降低,但房地产市场却感受到了浓浓的暖意。12月2日,碧桂园与顺德农商银行签署战略合作协议,后者将为碧桂园集团提供总额不超过200亿元的意向性综合授信支持,进一步拓宽合作观察昔日复工抢人,现在包机出国抢单浙江为何更快?12月4日,国内省级商务部门带队出国第一团由浙江省商务厅组织的千团万企拓市场抢订单行动首团启程前往欧洲同一天,有50家企业96人参加的嘉兴市商务局抢单团包机奔赴日本,创下全国市级参12月8日茅台行情价格表震荡下跌今日(12月08日),从网络发布的白酒价格行情监测数据显示,回收价,参考行情散瓶价格向下浮动050左右,原箱价格向下浮动0150左右,每个地区回收价格差异较大只能区间代替,行情价格量贩零食店兴起,新零食自由(报告作者信达证券分析师马铮)当前零食零售端正在发生较大的渠道变迁,零食量贩店供给端和需求端模型跑通,将高效承接来自传统卖场商超的流量转移,该业态有望迎来高速发展,当前行业门店数量