粉丝8619获赞3.2万


并发编程,深入原码了解如何确保县城的执行顺序。哈喽,大家好,我是架构师奶爸。在实际业务场景中,有时后启动的县城可能需要依赖先启动的县城执行完成,才能正确的执行县城中的业务逻辑, 此时就需要确保县城的执行顺序。那么如何确保县城的执行顺序呢?可以使用 thread 类中的 draw a 方法来确保县城的执行顺序。例如上面的测试代码,可以看到 t h r e a d s o r t 零二类比 t h r e a d s o r t 零幺类。在每个线程的启动方法下面添加了调用线程的中 a 方法,此时运行 t h r e a d s o r t 零二类,结果如上所示。再次运行时 结果如上所示。第三次运行时结果如上所示。可以看到每次运行的结果都是相同的。所以使用 thread drive 方法能够保证现成的先后执行顺序。 drive 方法如何确保现成的执行顺序? 既然 threat 类的 join 方法能够确保现成的执行顺序,我们就一起来看看 thread 类的 join 方法到底是个什么鬼。进入 threat 的 join 方法如上所示,可以看到 join 方法调用同类中的一个有参 join 方法,并传递参数零,继续跟进代码 如上所示,可以看到有一个 long 类型参数的中 a 方法使用了 synchronized 修饰,说明这个方法同一时刻只能被一个实力或者方法调用。由于传递的参数为零,所以程序会进入。如 图上代码逻辑。首先在代码中以 wifi 循环的方式来判断当前县城是否已经启动,处于活跃状态。如果已经启动,处于活跃状态,则调用同类中的 wit 方法并传递参数零, 继续跟进 weight 方法。如上所示,可以看到, weight 方法是一个本地方法,通过 j n i 的方式调用 j d k 底层的方法来使现成等待执行完成。 需要注意的是,调用线程的位方法时,会使主线程处于等待状态,等待子线程执行完成后再次向下执行。 也就是说,在 t h r e a d s o r t 零二类的 main 方法中,调用子线程的中 a 方法会阻塞 main 方法的执行。当子线程执行完成后, main 方法会继续向下执 行,启动第二个子县城,并执行子县城的业务逻辑,以此类推。想了解更多 java 架构师岗位知识,请关注我,架构师奶爸共同筑基 java 架构师。

然后呢是这个 is life, 他是获取线程是否存活?如果存活呢?会返回出,如果还在执行当中呢?啊?会返回 force, 这个非常的简单啊,我们可以在之前的这个角影里面呢来输出给大家看一下。比如说 t 一, 我们在执行这个启动线程的时候,他肯定是存活的,对吧?那么我们使用脚影等待子线程执行完毕,那么这里输出之后呢,肯定是子线程已经输出完毕了,对吧?那此时呢线程他就不是存活的状态了,这个很好理解,对吧? 那么这里呢,肯定是处和 force, 对吧?这个应该非常的简单。然后我们再来讲一下这个守护县城啊,本视频的文档我已经整理好了,并且与往期内容一起汇入,放在了视频的最后面,坚持看完一定对你有帮助。 nice, 那默认情况下,我们的县城呢,称之为用户县城,或者叫做普通县城。 当你为某一个县城调用 seed demon 为处的时候,他就称之为守护县城。所以县城呢,分为两种,一种是守护县城,一种是用户县城,或者称之为普通县城。 那默认的情况下,我们应用想要关闭的话,他是不是需要等待我们所有的线程 执行完毕,我们的这个进程他才会结束或者关闭啊?对不对?这个我们之前应该都体验过,大家可以看一下我这个实力代码,我在这里呢创建了一个子线程,然后循环输出睡眠,然后呢主线程直接输出,主线程结束,我们运行看一下, ok, 主线程他默认的是普通普通线程,用户线程,对吧?所以说他执行完毕之后呢,他主线程就结束了, 那么此时大家可以看到我们的进程并没有结束,对不对?就是因为我们的子线程呢,还在循环当中去执行,所以说子线程由于他也是普通线程,所以说呢,我们的进程并不会结束。 那如果你为这个紫线城设置为 sit demon 为处的话,那么此时会发生什么呢?也就是我们的普通县城 只要结束啊,守护县城他立马就会结束,那么普通县城结束了之后啊,我们的进城就会关闭了,对不对?他就不会再等你守护县城执行完了,能明白 这相当于很多已经啊太监,对吧?对于皇帝的忠诚。所以说我们的呃守护县城呢,就是守护用户县城的, 就相当于守护县城呢,他是太监,对不对?用户县城呢?是皇上,如果是皇上死了的话,嗯,是太监也没有必要活了,对不对?大概是这样的一个意思,我们来看一下,当我为这个子县城设置为守护县城的话,那么我们的主县城结束了, 那么他就会立马结束,不管你执行到了哪一区。好吧,好,大家可以看到,此时我们的进程随着主线程结束,进程也就立马结束了,对不对?所以说守护 进程他就是起这个作用啊,当然我们默认情况下是不会设置他的,因为我们希望我们的业务代码呢啊,执行完之后再去关闭我们的进程,当然他也并不是一无是处啊,实际在我们的一些呃, 我们的一些底层啊,还是很多地方运用到了守护县城,就比如说我们 gdk 的这个呃,垃圾回收器,他就是属于守护县城啊,为什么呢? 这个垃圾回收器大家应该都知道它的作用吧,也就是当我们的比如说 g m 当中堆内存满了,对吧?就会触发垃圾回收机制, 他会将我们的啊,就是没有引用的这些对象呢都给回收掉,那么此时当我们的堆满了,触发了垃圾回收机制,假如说我们的进程需要中断,你觉得这个垃圾 回收还需要回收吗?对吧?你不是回收了个寂寞吗?所以说我进程都结束了,垃圾回收就没有必要再去回收我们的这些对对象了,好吧,然后呢,还有 tomcat, 他用来接收处理外部请求的这些县城啊,都是守护县城,也就是我的 tomcat 一旦执行杀的到, 也就是停止的命令,那么你这些啊,正在请求的这些用户的这些县城啊,那么会立马停止, 好吧,所以说在一些底层,我们的还是很多地方用到了守护县城,也就是说当我们的程序停掉了, 你不希望他再去运行的时候呢,就可以设置为守护线的,好吧,好,我们最后通过 get state 获取当天线程状态,来讲解一下线程在抓案当中的六种状态。哪六种状态呢?我们来看一下这六种 状态,如果大家记不住的话,我们可以通过 sara 的类,它内部呢生命了一个媒体 state, 那这六种状态呢?就在这个 state 媒体类当中,好吧,然后我们分别来介绍一下,首先呢是 new 初始状态,这个状态很好理解,就是我们创建了一个县城, 但是呢并没有调用他的 star 的,也就是并没有启动,那么就是初始状态好吧,然后呢是 runnable 运行状态,那么显而易见,这种状态呢,就是我们已经调用了 star 的方法,已经启动了。 那么当然我们的县城,当你运行完之后呢,他并不是一直保持在 runnable 状态,比如说你调用了 sleep, 你调用了 wait 等等,这些导致县城等待的方法呢,他可能就会切换成 vt 或者 mvt。 比如说当我们调转交易,他就会切换成等待状态,当我们的交易带上了时间参数,就会切换成 time 的微停好吧,也就是你对应的,只要造成现成等待, 并且加上了时间参数,他就是台目的 vt, 没有加时间参数,他就是 vt 好吧。然后这个阻塞状态呢,就是我们一个县城, 比如说使用了这个同步锁,这个 synchronite 等,我们后面呢会详细的去讲各种锁,好吧,我们只需要提前呢去了解一下这个同步锁,就比如说我在一个方法上面使用了同步锁, 那么我现成一,首先获取到了这把锁,我现成二,想要去调用这个方法,那么需要呢,等待我现成一执行完之后才能进行调用,好吧,我现成二呢,就会进入一个组 色状态,先暂时理解好吧,然后呢是运行时呢,会有这四种状态好吧,当然你没有特殊情况呢,他肯定就是装的我的状态 ok, 那么当我们的这个线程运行完之后呢,他最终就会进入终止状态, 哇,大概是这几个状态,那我们通过代码呢来给大家更明显的观察一下。首先呢是第一种就是 new, 也就是我们创建了一个县城,然后你此时输出这个县城呢,他就是 new, 这个就不用我演示了,好吧?然后呢是中指,也就是县城运行完之后, 我们在这里睡了三秒,这个线程已经执行完,那么他的这个装状态呢,肯定就是中指,这个我也不演示了,好吧,这个都非常好理解啊。然后就是 runner 不,当我们创建了一个线程,然后去启动他, 此时你输出的这个状态呢,它就是 runnable, 正在运行。好吧,这个也不用演示了,这个也非常好理解,好吧,那就是剩下的这个 block 的这还有这个 waiting 和 time 的 waiting, 我们来分别看一下。首先呢 block block, 它是由于我们 县城使用了这个排查锁同步锁,导致了其他县城呢进行了堵塞,那么才会出现的一个状态,所以说我在这里呢啊声明了一个方法,就使用了这个同步锁, 然后呢创建了两个县城,大家注意看,一个县城呢,他去调用这个有同步锁的方法,然后呢去睡眠两秒,那么此时呢第二个县城你再去调用这个方法就会怎么样? 就会阻塞,等待,需要等待。第一个线程执行完之后呢,第二个线程他才会,他才能执行,那此时如果线程二他正在阻塞的状态,你获取他的状态呢?此时就是 block。 好吧, 那么我来给大家打几个断点来调试一下。嗯,我们来 分别看一下,首先呢是线程一他词大的,然后呢他会去执行这个方法,对吧?那么线程一呢,他会进来执行这个方法, 然后呢线程二 star, 他会此时线程二执行这个方法,由于线程一正在执行,因为使用了这个睡眠,对吧?所以说线程一正在睡眠,线程二呢是无法执行的,那么线程二此时 获取到,我们来验证一下,看是不是对应的这个 block 的状态。 好,首先呢,这个先乘一 star, 先乘一调用这个同步锁的方法,那么他进入到了这个方法,此时呢睡眠 线程二调用 star, 然后线程二调用这个同步的方法,那么此时呢,他是不会进这个方法的,因为线程一正在阻塞当中,那么此时呢,获取到线程二的状态,那么他就是 runnable, 不对啊,我们来看一下控制台啊,可能是我这个带控制台的这个时间啊,他这个时间已经过了,也就是线程一啊,他的这个睡眠的两秒已经过了,然后线程二 已经解除了这个阻塞状态,好吧,我这次我执行快一点,要不然这个两秒的时间过了之后呢,他这个阻塞状态就没有了。好,此时你看是不是就 block 的? 不明白刚刚是因为什么?刚刚是因为我在给大家讲解线程一他在执行这个同步方法的时候,然后呢,我正在讲解,讲解,然后两秒可能已经过了,然后我在这里打断点的时候呢,给大家征听这个变量的时候,有可能线程二他已经解除了这个同步锁, 能明白,因为他只要等两秒啊,星辰一他睡两秒,对吧?所以说我刚刚可能讲解的时间超过了两秒导致呢?这个不呃,阻塞状态已经解除了,能理解,那么我刚刚调调快一点,大家就可以看到他是 block, 好吧,这个小插曲应该问题不大,大家应该都能理解。 ok, 好,那 block 完了之后呢,我们再来看一下这个啊, waiting, 还有 time 的 waiting, 我刚才说了 waiting 和 time 的 waiting, 它们之间的区别呢,都是会进入一个等待的状态,那么什么方法会造成等待呢? 你像我们的呃,这个 sleep 睡眠,对吧?还有 join, 我们之前的 join 他也会等待,对吧?还有这个喂的方法,这喂的方法呢?我们现在还没有讲到 就喂的方法,它是任何一个对象都有的一个方法,它并不是 server 单独提供的。好吧, 当我们去调这个喂的方法的时候呢,此时他也会进入等待的状态,好吧,此时呢,这句代码也会等待在这里堵塞,堵塞在这里不会去执行下一句, ok, 然后呢,你也可以输入这个时间的单位,也就是阻塞多久,等待多久。 ok, 好,我来给大家验证一下。这个我们怎么验证呢?我们来看一下,我先来看一下我的代码, 首先呢,我在这里创建了一个方法,然后呢去调用它,然后去启动,那么在这里呢,进入了胃头,也就是这句代码呢,会停在这里, 然后我们此时输出这个线程他的状态,那么应该呢,就是啊,微停了,因为我们没有加参数吗?来看一下,好吧, reasonable, runnable, 我想一下他为什么会 runnable 呢?有可能我在运行到这一句代码的时候呢,啊,这 这个县城还没有执行到位的方法,所以说我们看到的这个状态呢,还是 runnable, 能不能明白?也就是当我们运行 get state 子县城呢?还并没有执行到这一句,所以说他的状态是 runnable, 所以说我们可以在 nice。

好,来看一下这道面试题啊, sleep with join you 的这四个方法的一个区别,那么这道题呢,通常在考察这个县城这一块的知识的时候啊,还有呢,我们的锁这一块 知识的时候,那么这个问题他出现的这个频率呢,也是相当之高。好,那么应对这个问题啊,应该怎么样来回答?我们来看一下韩美老师给出的一个答案啊。那么首先呢,在回答这个问题的时候,我们要明白两个概念,一个呢是锁持,一个呢叫做等待词 啊,那么所有需要竞争同步锁的现场都了会放在锁匙当中,都会放在锁匙当中啊,什么叫锁匙?就是我们 如果一个方法上加了一个星球 nice 的加了锁,那么这个时候呢,我们的县城就会有竞争锁,对不对?那么如果说你没拿到锁的话,那么呢这个 现成的就会把杯了放到这个锁池当中,当然你如果拿到锁了,那么你直接就去运行就可以了啊,好, 也就说啊,当前对象的锁了已经被其中一个县城达到,对吧?其他的县城呢,需要在这个锁池中呢进行等待啊,当前面的县城释放同步锁后,然后呢锁池中的这个县城呢去竞争同步锁啊,当某个县城得到后,就会进入旧序对列,然后呢就等待 cpu 的分配,这个是锁持这个概念要明白。 还有一个呢叫做等待池,等待池呢,主要是针对这个胃的方法啊,针对这个胃的方法,那么当我们调用这个胃的方法后,现成呢就会进入这个等待池中,就是你我们的这个在我们的这个呃生圈 nice 的这个同步代码快中啊, 如果你调用了一个胃的方法,那么这个时候呢,就是你首先你是拿到锁了,对不对?你拿到锁了,你肯定不在锁池当中,然后你拿到锁了,你调用了这个味道 方法,那么呢会把当前的这个线程呢拿到锁的这个线程呢放到这个等待池中,然后等待池中的线程呢,他不会去竞争同步锁啊,因为我们的位得了,他是会把这个锁了给释放掉的,把锁释放掉,这个时候啊,他呢不会去竞争同步锁,那 只有当你呢调用了落地费或者是落地费之后,他才会呢重新开始去了竞争所啊,然后落地费跟落地费哦啊,落地费呢,就是随机的从这个等待池里面呢选出一个现成放到了这个锁池里面去啊, 就是从这个等待池中啊,从这个等待池中把这个线针呢放到这个锁池中来,把从这里把它移到这边来啊,这样的话呢, 他又可以了重新的去竞争所,重新竞争所,然后拿到所了之后之后呢就等待 cpu 分配,而洛丽发哦了,就相当于呢就是将等待这种所有的现成全部丢到这个锁匙中, 所以呢要明白这个,明白这个锁匙跟这个等待词啊,就理解了这个味道,以及了这个罗迪饭啊这这一块的知识啊好, 那么这个斯利普跟我们这个味道啊,这两个,这两个其实是问的频率很高的啊斯味道,而这个斯利普啊跟味道他之间的一个区别啊,那么我这里呢总结了这个这么六点区别,我们来看一下, 首先第一点呢,斯内部呢,是属于我们斯瑞的类的一个静态的本地方法,他也是一个类 t 五啊, v 的呢,也是一个类 t 五方法,他们都是类 t 五方法,但是这个斯内部呢,他是一个静态的,然后呢是在我们斯瑞的类同中啊,威特呢是 object 的类中,这是第一个区别。 然后第二个区别了,这个撕内部方法呢,他是不会释放锁的,但是味道他会释放,而且呢会加入到这个等待队列,就是我们说的那个等待池啊, 好,私立捕啊,其实就是把 cpu 的这个执行资格啊和执行权就是释放出去,不再运行此现成,当定时时间结束再取回 cpu 资料,也就是说啊,这个私立捕到时间了啊,然后呢重新参与这个 cpu 的调度啊, 获取到 cpu 之后呢,又重新运行,那么如果说这个是利浦的时候,就是我们在调这个是利浦的时候啊,这个县城呢,极有可能呢也会有锁,对不对?我们在这个生存耐指的这个代码块中也可以去调这个是利浦啊,那么这个时候这个是利浦呢,他不会释放这个锁,所以呢,我们要注意这个问题啊,我们说是利浦调,是利浦啊, 他呢这个锁啊,他是不会释放的啊,要注意这个这个地方啊,也就说他如果有锁的话他不会释放,有锁的话他就不会释放啊,而是呢把锁了带着一起的进入冻结状态啊, 也就是说这个其他的这个需要这个锁的现成呢,他是不可能拿到这个锁的,因为他已经被冻结了吗?对不对?要知道了,这个是利不了超时啊,也就说了这个程序就无法执行了,在这里要休眠啊,就在这里休眠,直到了。呃,别的程序掉了一个 inter rap 的,或者是呢,他自己超时啊,当然了,这个 inter rap 的话呢,就跟 weight 一样啊,去响应中断啊, 好,那么第三点呢,就是这个撕内部方法呢,他是不依赖于这个同步器的啊,不在这里面呢,不在这种方法里面,他也是可以掉的,但是味道不行,味道呢,是跟这个星空赖子是配套使用的啊。 还有一点就是这个第四点啊,斯利布呢,不,不需要被唤醒,但是魏德呢,他是需要被唤醒的,当然了,我们说的是这个魏德的这个不带参数的方法啊,就是不指定时间,需要被别人中断啊,还有或者是荣誉范,当然魏德呢,现在呢,也提供了一个魏德里面也可以带时间的方法,那么这个是不一样的啊,好,斯利布呢,还有第五点啊,斯利布呢, 一般用于当前的县城休眠,或者是呢人群暂停等等操作而位的,实际上是属于我们的多县城之间的一个通信机制啊,就是多县城之间的一个通信, 就是我们知道这个 lody fight, 对吧? lody fight 是由一个县城的,比如说是 a 县城调用,但是他唤醒的呢,是 b 县城,对不对?属于了县城之间的一个通信啊, 所以这个是斯利普跟 weight 一个很明显的一个差别啊,好,第六点呢,就是这个斯利普了,他会让出 cpu 执行时间,且了强制的切换这个上下文,就说他一定会让出 cpu, 然后呢,强制切换上下文, 而这个未得了还是不一定的,他不一定会,就是,嗯,让出 cpu 啊,因为未得了之后啊,他还是有机会重新去竞争所,然后呢,继续执行,因为这掉了这个位的可能呢,别的他不会立马的去切换这个上下纹 啊,啊,胃疼了,他是有可能会,就是说胃疼之后可能马上唤醒他,重新呢,又获取到这个 cpu, 所以呢,他的上下纹呢,是不一定会切换的啊。 好,那么但是斯里布是强制上下文切换,那么接下来我们再看一下这个 eled 跟这个交易,那么这两个方法就比较好理解了。 el 的话,就是执行后啊,县城的直接进入就绪状态,相当于了马上释放 cpu, 也就是说我这个县城啊,现在正在运行, 然后呢,可能运行到这个地方的时候,其实呢,我现在呢,还是属于的就是拥有的 cpu 啊, cpu 这个时间变得还没有执行完,但, 但是呢,我现在不想执行了,那么我把 cpu 让出去就掉,这个诱的啊,就是,但是呢,他保留了 cpu 的执行资格啊,所以呢,就是说他只是进入了一个就绪状态,而不是呢,嗯,主色状态啊,他是就绪状态,所以说他有可能呢,在 cpu 下次调度的时候重新获取到, 然后呢继续运行,也就说有可能这个要的啥事都没干啊,然后呢,你继续又接着执行,但是有可能呢,他这个 cpu 又分给别人,极有可能呢,这个他就会进入这个就绪状态啊。好, 这个是医药的,这个很好理解,然后脚印的相当于这个医药的,其实就是说我,我让别人优先执行,好让你先让别的县城先执行, 但是呢,如果别的县城啊,就是如果我掉了一二等,你还是抢不到 cpu 啊,或者 cpu 还是没分配给你,还是分配给我了,那就没办法了啊,好,这个脚印呢,脚印方法呢,就是是这么一个含义啊,就是说我执行后呢,现成的一定会进入主色状态,但是呢,这个脚印要注意啊,他是这么来用的, 就是我在县城 b 中调用县城 a 的交引方法啊,在县城 b 中啊,调用县城 a 的交引,比如说我,我这里一个县城啊,我这是一个面方法,对不对?我在这个面方法中啊,去调用一个 p 一的一个交引, 我这里呢,嗯,清洗了一个县城,对不对?清洗了一个县城 t 一这个县城,那么我在这个面县城中掉了 t 一这个县城啊, 那么线层 b 呀,他进入主色的是线层 b, 也就是说进入主色的是我的妹线程,不是 t 一线程啊,不是 t 一线程,进入主色的是妹线程,那么呢,直到这个 t 一线程执行完,那么妹线程呢,才可以往下执行,这是脚印方法啊,好, 所以呢,我们来看下面这段代码他的一个执行结果了,这个卖方法我们看一下啊,就是说我了 t 一啊,当然要先掉是大的,再掉交易啊,先掉是大的,再掉交易,否则你掉过来了,你这个顺序换过来的话,就是没有用的啊。 那么这里呢,他一定会先打印这个 t 一的内容,然后呢再打印这个 man 的内容啊,哪怕你在这上面睡得再久,都是先打印 t 一,再打印 man, 这个就是揪引这个方法的一个含义啊,那么明白了这段代码的话,那么揪引这个方法呢,就很好理解 啊。好,那么以上呢,就是这是利普费的交引已有的啊,这四个方法的一个区别。前面两个呢,主要是这个啊,主色这一块,对吧?就是释放锁以及呢他所所的内部一样啊,交引呢,主要是啊,就是 一定要等待,等,等待这个我调蚯蚓的这个现成执行完我本身呢才能够开始执行,又得了让出 cpu 时间片啊,那么这是这四个方法的一个主要的一个区别。

哈喽,大家好,我是加瓦小黄豆啊,那么我们来看一看一道面试题,也就是说的话呢,有一个县城在魅县城中进行了绝影, 那么请问如何把这个现成的胶印给他中断呢?好,实际上这个面试题的话呢,有点意思啊,也就是考察我们的胶印的中断, 那么脚印的中段的话呢,我们只需要关注一点就行了,呃,比如说 a 线城在 b 线城中脚印呢,那我们只能用 b 线城的哎中段信号来中断 a 线城的脚印, 所以说呢,我们只要紧扣这一点就行了啊,所以说的话, t 一线城在魅线城中进行了交易,那么我们只能使用魅线城对象来中断踢一的脚印,否则没有办法的啊。好,那么我来看一看,这里呢有一个县城,是吧,获得当前县城对象,那么这个县城当然是魅 县城的,然后我们创建一个县城,这个县城是 t, 那么这个县城的打印一到二十, 然后呢,我们每打印一个数呢,我们哎把它休眠五百毫秒,然后的话呢,当 a 等于八的时候,我们调用主线层的对象,哎,就是这个对象,然后进行呢,因此 rap, 换句话说,我们要踢掉踢的脚印,那么下面踢一定会脚印,我们再往下看啊, 那么我们把 t 现成呢给他创建出来,然后的话呢,取名为 t 一,然后开始现成,那么因此这个时候 t 现成已经开始了,然后魅现成的话呢,我们做一个简单的测试,我们打印一百到一百一十, 然后打一魅线城的,哎,然后的话呢,当这个魅线城打到这个一百零三的时候,也就是货循环了三次之后,我们让这个 踢一线城脚印,那么这样的情况下呢,我们踢一线城的一到十一到二十就会全部打印完毕啊, 那么在这个时候的话呢,我们给他一个中断信号,那就是我们刚刚可以看到了,如果当这个 t 线层的话,打印到八的时候,立即有主线层给出中断信号,所以说的话呢,哎,这个胶印的话呢,只要打到八的时候,他就会立即被中断了,那么这样的话呢,就达到了我们的要求, 提点脚印被中断了,然后这边就是呢每过五百毫秒打印一个数,好,我们来看一看结果是什么样的啊?那么我们首先呢把这个未中断信号, 把这个中端信号给他注释掉,也就说我们并不使用内线层进行对踢的胶印的中断,我们看看效果是什么样的, 好,我们把这个效果穿啊, 这个效果双口,也就是输出双口打开,然后我们执行再执行一遍啊,我们会发现啊妹呢,打印到一百一百零三,好,打印到一百零三的时候, t 一交易呢,然后 t 一的话会达到二十,然后的话呢妹才会继续开始打印 好幺零四幺零五幺零六幺零七幺零八幺零九幺幺零,然后的话呢,实际上呢,我们当 t 一呢打印到八的时候进行中断,那么这个时候的 t 的脚印也就会被中断了啊,好,我们再把这个打开,好,我们来看看会是什么样的一个效果,执行一下, 好,我们可以看啊妹啊,幺零三, ok, 踢交易了,然后踢打到八的时候中断, ok, 中断了之后,那么踢呢?交易一旦被中断,那么踢在打赢十十一的时候,妹也会进行抢 cpu 连片进行打印。好,那么实际上呢?这就是一个脚印的中断啊。好,点赞加关注。

五分钟被八股卷进大厂,来,我们来看一下这道面试题,问县城的 sleep wait john year 的如何使用?难度指数,三颗星。如果同学想在二零二一年的北上广深行拿到二十 k 以上的薪资,那么这个问题避之避讳。来,我们来直接看资料 来,这个是老师给大家整理的资料,如果有同学想获取这份资料,可以扫一下右上角我的二维码,对吧?我的小猪手的二维码,然后来领取这份资料来,我们先看怎么给面试官打。首先来看实力谱, 那么给面试官聊的时候,我们可以看一下死离谱,我们可以通过这个方法,原,这是他的方法原型来进行调用,目的是让县城进行睡眠,也就是说让他从执行状态变为 主色状态。这个面试官这么聊好,那么再聊一下斯利普,他会造成程序发生什么中断异常,也就是说 斯里普的时候,你如果说在掉斯里普现成的睡眠,如果有别的县城中断了,他会抛出什么中断异常?那而且还要需要注意的是,如果说你通过他获取了索斯里普是不释放所的,对不对?好,我们来看 wait, 为什么呢?只有先获取到相应的监视技术,也就是说你只能在牲口 nice 的里面来进行调用,那么如果说我们在这里 不在牲口袋子里面去拿到位置,那会发生什么情况?会发生无效的监视器遗产, 那么吊用胃头会干嘛?会让县城去堵塞并且释放深空袋子的锁,而且可以通过 note five or notify or 来进行唤醒,对不对? ok, 那么这个是它的使用方式。好,再往下我们来看。 john 方法是用于线程之间的一种斜筒,什么意思?一个调用坐稳之后就是 a 必须比如说 a 里面钓 b 点坐,那就是等待线程 b 执行完毕之后才能执行,那么我们可以在代码里面用 c 的 b 点坐,那么就当相当于等待咱们的线程 b 执行完毕,对不对? ok, 这个是他。 好,那我们继续往下看一下 yo 的, yo 的让当前正在执行的县城回到 可执行状态,那是什么意思啊?其实就是让出当前 cpu, 也就是说了我自己让出了这 cpu, 让其他现成哎来 选取执行,但是业务的他并不保证他不像死离谱一定会让睡眠,他不是让他去睡眠,他只是切换现成而已。当然如果当前现成的优先级过高,或者是他运行时间比较短,那么操作系统还 会再次调度他,只有叶的,只是给超系统说我让步,但是有可能会被再次选中,那么可以通过我们的这个方法来进行选取,对吧?然后我们如果说所有的点叶的来让出 cpu, 好, 那么总结来说呢,我们的叶尔德就有啥特点,就是让一个县城从运行变为就绪,而不是主色,叶尔德不能保证当前正在执行的县城迅速变到就业状态。 ok, 即使发生迅速结块,有可能操作系统又会选择当前叶尔德的这个县城来进行执行。 ok, 那么这个给面试官打到这里就可以了。那如果有同学想获取什么资料的同学可以扫一下右上角的二维码来加一下我的小助手来领取这份资料。

今天我们来聊一下并发编程中的召唤方法。召唤的使用场景呢,是等待现场执行终止之后必须执行。 比如我们有一个闷县城,运行之后又开启了县城一和县城二,但是闷县城中的部分业务代码呢,必须懂得县城一和二都执行完成之后才能执行, 这时候就可以调用县城一和县城二的重要的方法,让主县城进入左侧等待的状态,当县城一和县城二执行完毕之后,就可以继续执行主县城了。 这种模式呢,类似于 max 的 wifi 并发的这种模式,或者坑布雷神森维斯这种并发模式,也可以使用 cot 档乱尺啊这种并发类来完成。 关于转换方法呢,有个容易混淆的知识点就是转换方法,他是 stry 的类当中的直接提供的方法,而 v 的和 notife 是凹不 类当中的方法,这个是面试当中的一个小重点。此内容源自我的并发编程核心技术技术篇课程,关注我学习更多并发体系知识。

大家好,今天分享一下我们 focal dream pro 现成池,一个将大任务拆分成小任务并行执行,结合窃取模式提高整体执行效率的现成池。 两个核心点可以分开来看,先 for 再撞,也就是说先拆分再合并。第二个,达到某个规则不再拆分。来看一个场景求一到一百亿的数据,和今天从两个方面来分享,第一个编写我们的场景案例代码。第二个提升执行效率的关键点在哪里?来,首先我们看一下 我们普通边角的串形代码,我们用放循环,循环一百亿次,然后最后求和结果,我们再打印一下它的耗时,同时这里打印出来结果也验证下我们下面的 force driven pro 的现成池执行的时候结果是否正确。重点的类,我们想使用 force drone 现成池,我们 我们的任务需要继承 recurse task 这个类,其实大家可以点进去看一下, java 提供 demo 也很简单,使我们的飞奔纳妾函数求和。首先我这里定义一个边界,也就是说达到某个规则就不进行拆分了,然后我们拆拆分的开始值,结束值, 然后这是我们要实现的方法,如果说边界小于我们的指定的规则,我们就不再进行拆分,然后直接进行求和, 如果没有的话,我们进行除二,然后进行拆分,拆分完之后我们进行两边的合并,这里的话我们现成池很简单, new 我们的包括 john 现成池,然后我们的任务类卡住我们的对应的任务数,然后直 执行我们的任务,最后结束我们的现征池,然后打一下我们的耗时以及窃取任务数有多少个,来我们执行一下,看它的性能怎么样。来,首先看一下正确的结果,两边计算都 是一样的,我们的判刑二百七十九毫秒,我们的包装铺并行幺五七毫秒,性能提升还是很明显的,窃取任务数是幺七三。然后我说一下重点提升到县城池的执行效率的我们的最小规则,我们的临界值,这个值你可以在项目中进行调试,来 三百八吧,你发现三百八执行出来的结果耗时还比我们的串行要高了。所以说这个值并不是越小越,而是你要根据你的任务数进行调试,得出最佳结果。好,今天的视频我就分享到这里,谢谢大家。 nice。

好,来看一下这道面试题啊,是利普胃疼、交引医药的这四个方法的一个区别。那么这道题呢,通常在考察这个县城这一块的知识的时候啊,还有呢我们的所这一块的 知识的时候,那么这个问题他出现的这个频率呢,也是相当之高。好,那么应对这个问题啊,应该怎么样来回答?我们来看一下韩梅老师给出的一个答案啊。那么首先呢,在回答这个问题的时候,我们要明白两个概念,一个呢是锁词,一个呢叫做等待词 啊,那么所有需要竞争同步锁的现场都了会放在锁匙当中,都会放在锁匙当中啊。什么叫锁匙?就是我们 如果一个方法上加了一个伸出 nice 的加了锁,那么这个时候呢,我们的县城就会有竞争锁对不对?那么如果说你没拿到锁的话,那么这个 现成的就会半背了,放到这个锁匙当中,当然你如果拿到锁了,那么你直接就去运行就可以了啊。好, 也就是说当前对象的锁了,已经被其中一个县城达到对吧?其他的县城呢,需要在这个锁池中呢进行等待啊。当前面的县城释放同步锁后,然后呢锁池中的这个县城呢,去竞争同步锁啊,当某个县城得到后,就会进入就绪对列,然后呢就等待 cpu 的分配,这个是锁匙,这个概念要明白。 还有一个呢叫做等待词。等待词呢,主要是针对这个胃的方法啊,针对这个胃的方法,那么当我们调用这个胃的方法后,现成的就会进入这个等待时钟,就是你我们的这个在我们的这个身穿 nice 的这个同步代码块中啊, 如果你调用了一个味的方法,那么这个时候呢就是你首先你是拿到锁了对不对?你拿到锁了,你肯定不在锁池当中,然后你拿到锁了,你调用了这个味的 方法,那么呢会把当前的这个县城呢,拿到所的这个县城呢,放到这个等待之中,然后等待之中的县城呢,他不会去竞争同步所啊,因为我们的未得了,他是会把这个所呢给释放掉的,把所释放掉,这个时候他呢不会去竞争同步所。那 只有当你了调用了落地块或者是落地块之后,他才会呢重新开始去了竞争所啊,然后落地块跟落地块哦。啊,落地块呢,就是随机的从这个等待池里面呢,选出一个现成放到了这个锁池里面去啊, 就是从这个等待池中啊,从这个等待之中把这个县城呢放到这个锁池中来,把从这里把它移到这边来啊。这样的话呢, 他又可以了重新的去进诊所,重新进诊所,然后拿到锁了之后之后呢就等待 cpu 分配,而洛丽芬饿了就相当于了就是将等待之中所有的现成全部丢到这个锁匙中。 所以呢,要明白这个,明白这个所词跟这个等待词啊,就是理解了这个味道,以及了这个落地快啊这这一块的知识啊。好。 那么这个是利普跟我们这个味道啊,这两个这两个其实是问的频率很高的啊,是味道啊,这个是利普啊,跟味道它之间的一个区别啊。那么我这里呢总结了这个这么六点区别,我们来看一下。 首先第一点呢是内部呢,是属于我们思瑞的类的,一个静态的本地方法,他也是一个内替五啊,为的呢也是一个雷替五方法,他们都是雷替五方法,但是这个思利不了,他是一个静态的。然后呢,是在我们思瑞的内同中啊,为的呢是欧布借口的类中,这是第一个区别。 然后第二个区别呢,这个撕另一个方法呢,他是不会释放锁的,但是味道他会释放,而且呢会加入到这个等待队列,就是我们说的那个等待词啊, 好斯利普啊,其实就是把 cpu 的这个执行资格啊和执行权就是释放出去,不再运行此现成,当定时时间结束,再取回 cpu 质量。也就是说啊,这个斯利普到时间了啊,然后呢,重新参与这个 cpu 的调度啊, 获取到 cpu 之后呢,又重新运行。那么如果说这个斯利普的时候,就是我们在调这个斯利普的时候啊,这个现实呢,极有可能呢,也会有锁,对不对?我们在这个生圈耐子的这个代码块中,也可以去调这个斯利普啊,那么这个时候这个斯利普呢,他不会释放这个锁。所以呢,我们要注意这个问题啊,我们说斯利普调斯利普啊, 他呢这个锁啊,他是不会释放的啊,要注意这个这个地方啊,也就说他如果有锁的话,他不会释放,有锁的话,他就不会释放啊。而是呢,把锁呢,带着一起的进入冻结状态啊, 也就是说这个其他的这个需要这个锁的现成的,他是不可能拿到这个锁的,因为他已经被冻结了吗?对不对?要知道了,这个是利物了,超时啊,也就说了这个程序就无法执行了,在这里要休眠啊,就在这里休眠,直到了别的程序掉了一个英特 ra 普的,或者是呢他自己超时啊。当然的,这个英特 ra 普的的话呢,就跟为他一样去响应中断啊。 好。那么第三点呢,就是这个斯利姆方法呢,他是不依赖于这个同步器的啊,不在这里面呢,不在这种方法里面他也是可以调的,但是味道不行,味道呢是跟这个生根辣子是配套使用的啊。 还有一点就是这个第四点啊,是利补了不,不需要被唤醒,但是胃疼了,他是需要被唤醒的。当然了,我们说的是这个胃疼的这个不带参数的方法啊,就是不指定时间,需要被别人中断啊,还有或者是容易犯,当然胃疼了,现在呢也提供了一个胃疼里面也可以带时间的方法,那么这个是不一样的啊。好,思利补了。还有第五点啊,思利补了 一般用于当前的现成休眠,或者是呢人群暂停等等操作。而位的实际上是属于我们的多县城之间的一个通信机制啊,就是多县城之间的一个通信。 就是我我们知道这个 loger 对吧, loger 是由一个县城的,比如说是 a 县城调用,但是他唤醒的呢,是 b 县城对不对,属于了县城之间的一个通信啊。 所以这个是斯利普跟胃的一个很明显的一个差别啊。好。第六点呢,就是这个斯利普呢,他会让出 cpu 执行时间,且呢强制的切换。这个上下文就说他一定会让出 cpu, 然后呢,强制切换上下文, 而这个未得了,他是不一定的。他不一定会就是让出 cpu 啊,因为未得了之后啊,他还是有机会重新去竞争所。然后呢,继续执行,因为这掉了这个位置,可能呢,别的他不会立马的去切换这个上下文 啊,啊,为他了,他是有可能会,就是说为了之后可能马上唤醒他,重新呢,又获取到这个 cpu, 所以呢,他的上下文呢,是不一定会切换的啊。 好,那么但是实力不是强制上下文切换。那么接下来我们再看一下这个伊尔的跟这个交易。那么这两个方法就比较好理解了。伊尔的的话就是执行后啊,现成的直接进入就绪状态,相当于了马上释放 cpu, 也就是说我这个县城啊,现在正在运行, 然后呢,可能运行到这个地方的时候,其实呢,我现在呢还是属于的就是拥有的 cpu 啊, cpu 这个时间变了,还没有执行完, 但是呢,我现在不想执行了,那么我把 cbu 让出去,就调这个右的啊。就是,但是呢,他保留了 cbu 的执行资格啊。所以呢,就是说他只是进入了一个就绪状态,而不是呢,嗯,主色状态啊,他是就绪状态。所以说他有可能呢,在 cbu 下次调度的时候重新获取到, 然后呢,继续运行,也就是说有可能这个月他啥事都没干啊,然后呢,你继续又接着执行,但是有可能呢,他这个 cpu 又分给别人,有可能呢,这个他就会进入这个就绪状态啊。好, 这个是 eo 的,这个很好理解。然后胶引的,相当于这个 eo 的呢,其实就是说我,我让别人优先执行好,让你先让别的县城先执行。 但是呢,如果别的县城啊,就是如果我掉了,要的,你还是抢不到 cpu 啊,或者 cpu 还是没分配给你,还是分配给我了,那就没办法了啊。好,这个蚯蚓呢,蚯蚓方法呢,就是是这么一个含义啊,就是说我执行后呢,现成的一定会进入主色状态。但是呢,这个蚯蚓要注意啊,他是这么来用的。 就是我在县城 b 中调用县城 a 的交警方法啊,在县城 b 中啊,调用县城 a 的交警。比如说我,我这里一个县城啊,我这是一个面方法对不对?我在这个面方法中啊,去调用一个 p 一的一个交警。 我这里呢,兴起了一个县城,对不对,兴起了一个县城,第一这个县城,那么我在这个面县城中,掉了第一这个县城啊。 那么线程 b 啊,他进入主色的是线城 b, 也就说进入主色的是我的魅线城,不是 t 一线城啊,不是 t 一线城,进入主色的是魅线城。那么呢,直到这个 t 一线城执行完,那么魅线城呢,才可以往下执行,这是交警方法啊。好, 所以呢,我们来看下面这个代码,他的一个执行结果了。这个卖方法我们看一下啊,就是说我呢听一啊,当然要先吊死大的,再吊交椅啊,先吊死大的,再吊交椅,否则你调过来了,你这个顺序换过来的话,就是没有用的啊。 那么这里呢,他一定会先打印这个第一的内容,然后呢,再打印这个面的内容啊,哪怕你在这上面睡的再久,都是先打印第一,再打印面,这个就是交警这个方法的一个含义啊,那么明白了这段代码的话,那么交警这个方法就很好理解 啊。好。那么以上呢,就是这实力不会的交隐一有的啊,这四个方法的一个区别。前面两个呢,主要是这个啊,主色这一块对吧,就是释放,所以及呢他所属的内部一样啊。交隐的主要是啊,就是 一定要等待,等等待这个我调究影的这个现成执行完,我本身呢才能够开始执行,要的呢,让出 cpu 时间骗啊。那么这是这四个方法的一个主要的一个区别。

县城的生命周期以及到县城有哪些状态?那么实际上这两个问题呢,问的是同一个问题啊, 就是县城的生命周期也好,县城有哪些状态也好,其实都是统一的回答。那我们在回答县城的生命周期的时候,也需要了,就是结合这个县城在这个生命周期每一个阶段他是一个什么样的状态。 那么在回答这个状态的时候呢,实际上也是要结合这个现场在生命周期里面做出的一些事情,然后呢对应着什么样的一些状态啊。所以说这两个问题实际上呢是一样的啊。好,那么来看一下韩飞老师对这道问题给出的答案是什么? 那么首先我们县城中呢,通常呢有五种状态啊,叫做呢创建就绪,运行主色和死亡啊。那么主色呢,又分成三种,就是有三种情况会导致了这个县城主色。 那么第一种呢叫做等待主色,就是我们运行的这个县城呢,执行的位的方法,也就是我们 opt jack 的中的这个位的方法啊,就是配合我们的新装袋子的使用的这个位的。那么你调用了这个位的方法呢?县城呢会释放了占用的所有的资源,包括你的所资源啊。 然后呢把该现成的 gvm 啊,会把该现成的放入等待池中。然后呢进入这个状态之后,那么呢不能自动唤醒,必须要一号其他现成呢,调用这个 lody five 或者是 lody five 才能够被唤醒啊好。那么第二个呢,叫做同步主色, 同步主色呢,就是我们的深秋奈斯的啊,也就是我们的县城在去竞争所的时候,那么如果说你没有抢到锁,没有抢到锁的话,那么 j v m 呢?会把这个县城呢放入锁池中,注意这个是锁池,上面是等待池啊。好。那么第三个呢,是其他的主色,就是比如说我们的这个县城呢, 执行的是力谱,或者是呢交引啊,或者是发出了这个 io 请求,那么 jo 要么都会把这个线程视为主色状态啊。 那么当斯利不超时,或者是蚯蚓等待现成终止,或者是超时啊,或者呢 io 执行完毕,那么这个时候呢,重新转入就绪状态啊。重新转入就绪状态。还要注意的呢,是这个斯利不呢,是我们 siri 的内中的方法,而这个位的呢,是我们 object 的内中的方法啊。 好。那么这五个呃,生命周期中的这五个状态,那么分别代表着什么样的事情啊?就是分别代表着什么样的操作啊。 那么首先呢,是这个新建状态。新建状态呢,很好理解对吧,就是我们又来一个县城对象啊,就新建的一个县城对象,又来一个县城对象啊。第二个呢,就是就绪状态啊,当我们的县城对象创建好了之后,然后呢,我们去调查这个是大的方法对不对?好,但是呢,并不是说 说你掉了,这个是大的方法,线程呢,马上就会运行。不是的啊,你掉了,这个是大的方法,这个线程呢,只是变为了一个就绪状态,属于一个软肋脖的一个状态啊。他呢只是位于可运行线程之中, 可运行现成之中啊,就是带运行啊,变得可运行。然后呢,他要等待这个 cpu 的一个分配啊,那么当他获取到了这个 cpu, 他获取到 cpu 之后,那么这个时候呢,就开始执行吗?拿到 cpu 了就开始执行了,这个呢就叫做运行状态。运行状态真正的去执行我们的程序代码。 那么我们上面说的这个主色状态呢,其实就是指了这个县城呢,因为某种原因呢,放弃了这个 cpu 的使用权啊,放弃了 cpu 使用权,暂时呢停止运行,比如说我们调用了斯里布对吧?然后呢,直到这个县城呢,进入就绪状态,比如说斯里布超时,比如说我们的位的被了, 这个 lody 坏了,那么这个时候呢,他会重新变为这个,就是由这个主色状态重新呢变为这个就绪状态啊,然后呢等待 cpu 的分配。那么最后一个呢,就是死亡状态。那么死亡状态呢,就是我们的现成执行完了,或者是呢因为异常呢,退出了这个让方法,那么这个现成的生命周期了 就结束了,那么从新建到结束啊,那么这个是整个的这个县城的啊,这个生命周期以及啊中间呢会经历的这么几个状态,就是我们的生命周期中这么几个步骤啊。好,那么以上就是这个县城的生命周期以及了这个县城的五种状态。

并发编程如何确保多个县城执行的顺序?哈喽,大家好,我是架构师奶爸。我们都知道调用 threat the start 方法启动县城时,县城的执行顺序是不确定的。也就是说, 在同一个方法中连续创建多个县城后,调用县城的 start 方法的顺序并不能决定县城的执行顺序。 一、确保县城执行顺序的简单的事例在实际业务场景中,有时候启动的县城可能需要依赖先启动的县城执行完成后才能正确的执行本县城中的业务逻辑, 此时就需要确保线程的执行顺序。那么如何确保线程的执行顺序呢?可以使用 thread 类的 join 方法来确保线程的执行顺序。例如上面的测试代码可以看到 t h e d a d s o r t 零二类。在每个线程的启动方法下面添加了调用线程的中 a 方法,此时运行 t h e a d s o r t 零二类,结果如上所上所示。再次运行时结果如上所示。 第三次运行时结果如上所示。可以看到每次运行的结果都是相同的,所以使用 thread 的 join 方法能够保证现成的先后执行顺序。 two join 方法是如何确保现成的执行顺序呢?既然 thread 类的 join 方法能够确保现成的执行顺序, 我们就一起来看看 thread 类的 join 方法到底是个什么鬼。进入 thread 的 join 方法如上所示,可以看到 join 方法调用同类中的一个有餐 join 方法,并传递参数零,继续跟进大 如上所示,可以看到有一个 long 类型参数的周围方法使用了 synchronised 修饰,说明这个方法同一时刻只能被一个实力或者方法调用。由于传递的参数为零, 所以程序会进入如下代码逻辑,首先,在代码中以 y 循环的方式来判断当前县城是否已经启动,处于活跃状态。如果已经启动,处于活跃状态,则调用同类中的 wait 方法并传递参数零, 继续跟进 week 方法。如上所示。需要注意的是,调用线程的 way 方法时,会使主线程处于等待状态,等待子线程执行完成后再次向下执行。也就是说,在 t h r e a, d s o r t 零二类的 me 方法中,调用子线程的中 a 方 方法会阻塞 main 方法的执行。当子线程执行完成后, main 方法会继续向下执行,启动第二个子线程并执行子线程的业务逻辑。以此类推,可以看到, wait 方法是一个本地方法,通过 j n i 的方式调用 j d k 底层的方法来使现成等待执行完成。想学习更多 java 编程知识,请关注我,架构师奶爸共同筑基 java 架构师。

什么是多县城?为什么会有多县城呢?多是一个数量词,表示很多的意思,所以咱哥们只要知道什么是县城,这就可以了。县城的概念呢,非常的拗口,而且在里面还有一个专业名词,进城。所以咱哥们呀,先来解释一下什么是进城, 再回头去解释一下上面的这句话。那么进程呢,它是程序的基本执行实体。举个例子,比如说哥们打开一下任务管理器, 放大你来看,在任务管理期的第一个界面当中,他其实呢就是进程,每一个软件他都对应着一个进程。咱哥们俩可以这么理解,一个软件运行之后,他就是一个进程。看左边 microsoft powerpoint, ppt 的进程,还有下面 typo 笔记的进程,还有画图版的进程,你看是不是每一个正在运行的软件都是一个进程啊?是的呢,好,那么知道了什么是进程,咱哥们呀再回头去看上面的这句话,县城 它是操作系统当中能够运行调度的最小单位,它呢是被包含在进程当中的,它是进程当中实际的运作单位。来举个例子,比如说有一个软件呢,是叫做三六零,在三六零里面它是有很多很多独立的功能的,比如说木马查杀、电脑清理、系统修复、优化加速等等等等。 咱哥们就可以这么去理解,三六零这个软件运行之后,它的本身是一个进程,而三六零里面的木马查杀、电脑清理、系统修复、优化加速,我们就可以把它看作是四个 县城。所以关于县城可以简单理解,县城就是应用软件当中互相独立的,又可以同时运行的功能,那如果说这样的互相独立的能同时运行的功能比较多,就形成了多县城, 那我心里就在想了呀,这哥们他有什么用啊?此时啊,阿伟就要给你讲一个小故事,故事的主人公叫做小白。小白要去工厂打螺丝,这一天呢,他 他愉快的去上班,触犯了一个条例,被扣了一百块钱。但是呢,扣一百块钱不是重点,重点是在干活的时候。小白啊,他是负责一条流水线上的工作,工作的内容就是把流水线上的货物拿下来堆放在一起,但是呢,流水线上的货物他不是连续的, 假设每件货物的间隔时间是十分钟,那你觉得小白是不是搬了一个货物之后就可以摸鱼十分钟啊?是的呢,小白心里非常的爽,但是 老板这心里面就不爽了呀,老板心里想,每件货物结束你都歇十分钟,四舍五入就是没干活呀,你这小子整天闲着,我什么时候才能换劳斯莱斯呀?所以老板呢,就让小白同时负责两条流水线, 其实啊,如果还可以给小白再去加第三条,第四条加更多更多的流水线,小白一会干这个,一会干这个,一会再干这个,此时他是一个人,同时负责三条流水线,工作的效率就得到了提高。你有没有想过,小白为什么 可以同时操作三条流水线,提高工作效率呢?其实啊,是有原因的,它就是把货物间隔的可以用来摸鱼的十分钟充分利用起来了。那么这样呢,小白才能在三条流水线之间进行切换,这样子才能提高工作的效率。那么我们的代码是不是跟这个故事也有类似的呢? 说来看这段代码,咱哥们俩来分析一下过程。在运行的时候, cpu 首先呢,先是读到了第一行代码,那么在内存当中就会创建一个变量 a, 但是内存当中创建变量是不是要时间啊?虽然说这个时间很短很快,但是他也要时间,那么在创建的过程当中, cpu 他是没有办法继续运行下面的代码的,所以 cpu 只能先等。 那假设 cpu 呢,是等了零点零一秒,然后呢再去读第二行内核当中呢,再去创建了一个变量币,同样呢,在这一行, cpu 也等了零点零一秒,同理第三行也等了零点零一秒,第四行也等了零点零一秒。那么这个呢,就是我们以前代码的执行过程,以前的代码我们也 叫做单线程程序,因为它是从头往下依次运行的,就跟刚刚故事中的一条流水线是一样的, cpu 不会切换到其他代码中去运行,所以它的效率会比较低。你要注意,多线程程序的特点就是能同时的去做多件事情, cpu 可以在多个程序之间进行切换,把等待的空闲时间充分的利用起来,这就是多线程 大的特点,提高程序的运行效率。那么在实际开发当中,多线城无处不在,比如说软件中的耗时操作,像拷贝或者是迁移大文件,那哥们呀,一般都会是用多线程技术去搞定的, 因为如果说你用单线程,那么在拷贝的过程当中,根本就干不了气啥事情了呀,只能等着。再比如说加载大量的资源文件,特别是在玩游戏的时候, 点击了游戏之后会有这样的一个界面,他会去加载游戏的资源文件,但是在加载的同时,我还想让游戏去做其他的操作,比如说检查一下游戏的版本是否是最新的,比如说让后面的背景图片去 去动起来,再比如说播放一下背景音乐,所以在此时我们就会用到多线城。那么除此之外呢,像所有的聊天软件,所有的后台服务器都有多线城的声音,所以多线城的技术呢是非常的重要的。

加瓦多县城是如何实现的?和操作系统有什么关系?好,下面我们从底层原码来分析一下,那我们知道我们创建一个县城的话呢?哎,通过这个另一个是瑞的里边实现一个软的,然后我们通过十大的方法启动这个县城, 那这个时候我们启动现在通过 spa 的,那这个时候我们点到 style 的原码,然后这个原码里面我要走一下呢,哎,我们可以看一下,他最核心的是在这里呢,启动这个现成,那我们点到这个 style 人里面去, 然后他是一个 nito 魔法,通过节音 a 去访问 c 或者 c 加压代码。好,那么这个方法在哪里呢?我们需要来找到我们欧根基地开的圆码,哎,他在我们这个十二的点 c 这个圆码里面,那么在这里 死在了门,那么他对应会掉叉,那接下来我们找他。好,他就在我们这边。哎,在这里好,在这里的话呢,然后我们去找他的 一个实现啊,那么他的实现呢?在我们 jbmcpb 这个实现里边啊,在哪里呢?在我们这个地方,在这地方呢,然后他下面有一个核心的语句,那就是我们这个地方啊,创建一个加法啊,另一个加法时代的。 好,那么六,这个交往时的,然后这个在哪里?六呢?那么这个是我们找到这边的啊,使出来的点 cpp, 这个好,那么他就在,我们在我们这边来搜索一下, 好,那么找到之后呢,就在这个地方啊,在这里,好,那么构造他呢?是呢往下走一下,他的核心语句呢?在这个地方啊,可谓的创业线城,这是核心代码,那么这一句他创业上来创新的呢?我们现在以另一个手为例,那么他就在我们这样一个代码里边。好,那就是在我们这个代码在这里创业县城, 从现在呢,咱往下走的话呢,我们可以看到了这里有一个核心语句,通过这个函数来调用来创建好,那么这个函数呢,就是 我们利率公司的一个函数。哎,通过他就穿越个县城,好,那么这样过来我们这个县城就穿越好了。好,然后呢我们加个代码呢,这个启动的时候他掉了什么?他执行这个这个双乐狗里边那个乱方法。好,执行这个乱方法在哪里执行呢?好,那么这个方法里面他有个加拿大的。 好,那么这个江华时代的这个函数在哪里呢?在我们上面走一下,江华 sty 好,就在这个地方啊,江华 sty 好,千万在这里,那么然后呢?他在哪里呢?就是在下面这个位置,然后有一个地方,我们看一下他实在的掉软黄法,也就是说接下来他会在 c 加加的代码里边,然后调用加法的那个软黄法。好,这样就完成了一个现成的一个整个流程的, 这就是我们的这个问题的原码。好,所以说呢,我们加了多线程,是通过调用啊操作系统底层的库来实现这个多线程的,那么他是和操作系统是有关系的啊,并不是将把自己创立的多线程,而是调用的操作系统啊,实现多线程。