粉丝322获赞2623
哈喽,亲爱的小朋友们和大朋友们,我是菲菲,那么这节课我们继续讲一步一步一步与多线程的 task, 我们创建一个控制台的这个应用程序,然后呢, using a system, threading 还是跟以前一样,对吧?好,那么今天我们讲这个 task, 之前我们已经讲了 thread 和 thread 破,就是现成和现成池,对吧?那么帕斯科是什么呢?他就相当于 siri 的加上 siri 的破啊,这两个结合啊,使用起来呢也非常省心啊。 使用 task 创建一个现成的有三种方法, 第一种呢, task task 等于扭一个 task 里面放一个委托, 那么委托会关联一个方法,对吧?好,第二种呢, task 他有一个静态方法, task tasks are run 里面放一个维托。 那么上面这种呢,之后要使用 pass 个点 start 来将现成标记为就绪状态。 下面这个呢,你 task around 之后呢,就相当于创建了县城之后,然后使用 start 来将县城标记为就绪状态,那县城就可以跑起来了,对吧?好,第三种呢, task task 等于 task 点 factory, 点 start new 里面放一个委托 啊,这个就有点类似于那个县城值的用法,对吧?那么我们使用这三种方法来看一下这个县城怎么创建啊?首先我们说我们来做一个饭,做一个饭呢,煮个米饭大概要八分 中,怎么写? task cook, rice 等于六。一个 task 里面要放个委托来,我们右键转到 task 来看一下它的构造函数, 它高的函数呢?是 task 里面放个 action, 对吧?啊?放个 action, 呃,我们看看 task 这个类呢, 然后可以看到这个类它是实现了 i three to poor work item, 那么你可以猜想一下,他大概实现了献身词的一些借口,对吧? i have think result 呢?这个之前我们讲义部的时候已经用过了,对吧?然后这个 it is supposable 呢?这个是释放资源的一个, 这个不用管它,那么所以说它跟翼步有关系,它跟这个线针池呢?也有关系啊,这就像我们说的,它相当于 spred 加 strop。 好,这个里面要放个委托,放个 action, 我们可以使用一个 lam 大表达式, 像这样写,对吧? three 的点实力,我们烧一个饭要八分钟,我们用八千毫秒,就用八秒钟来代替一下。 在睡现成睡眠之前呢,我们来说出一行啊,开始做米饭, 八秒钟过后, 米饭准备完毕, 是不是做完了?那你看他会不会自动去运行这些东西来走,你 什么都没有,对吧?为什么什么都没有啊?上面我说了,你创建了一个 task 之后,你要使用 task 点 start 的方法来将现成标记为就绪状态,供系统去调度和执行。 那么这样一来的话,你想执行这个 task 呢?你需要把这个对象拿过来,点 start 一下, 再来开始做米饭,一二三四五六七八,等八秒钟, 米饭准备完毕,对吧?那有人说这个你 pass 个之后,他会不会继续往下执行啊? 来看一下,我在这边说出一句话,做米饭的时候我还在干别的事情, 如果这是一个同步方法,就是说你如果不用现成的话,他会在这边等,一直等八秒 啊,一直,那这在在这里 stop 之后,他会一直等八秒,等八秒钟之后才会去说出这句话,那么由于他是开了个新的县城,所以他会把这个内容啊放到一个新县城里面去执行,不会阻塞这个慢方法继续往下执行, 所以他即使 stat 之后,他也会紧跟着去执行这个。做米饭的时候我还干了别的事情,然后呢?过了八秒钟,米饭准备完毕,对吧?所以他的输出顺序是开始做米饭。做米饭的时候我还干了别的事情,然后过八秒钟米 刚准备完毕,应该是这样子来看一下好。做米饭的时候,我还干了别别的事情,开始做米饭, 等八秒钟,然后你会发现米饭做好了,对吧?呃,有人会说,我明明这边 stat 了呀, stat 之后为什么没有先去执行这个东西,反而他先去执行这个呢? 呃,我们说这个县城啊,他这个自然调度并不受我们的控制,这个之前已经讲过了,对吧?好,这是第一种。同样呢,我们喜欢做一些冷菜,对吧?好, task make 冷菜,我们就说 cold dishes。 好吧,我不知道冷菜 怎么说,大概就这样猜一下。等于我们说第二种方法, task dan run, 对吧? task dan run。 好,同样也是可以去使用一个兰达表达式 开始做冷菜, 那么冷菜大概需要六秒钟, threaded sleep 六秒钟。 然后呢?说出一句话,说冷菜准备完毕, 有人有的城市他们说冷菜独做凉菜,是吧?哎,做凉菜做冷菜,有的都有的把这个叫做冷盘,没有关系啊,各地的叫法不一样。 好,那么这样一个任务,他就是做米饭的,同时我也开始做冷菜,对吧?那么使用 task 点 run 呢?你不需要再去使用这个 make conditions get started 了, 他把这个现成创建完了之后,他会直接跑起来啊,直接让 cpu 让系统去调动,他不需要你在手动的去斯大提一下。好吧, 好,我们来看一下啊。走,你做米饭的时候我还干了别的事情,开始做米饭,开始做冷菜,谁先做好啊?肯定冷菜先做好,对吧?好,冷菜准备完毕。然后呢?米饭准备完毕。呃, 一个用了八秒,一个用了六秒,肯定是这个完成了之后两秒,差不多两秒吧,然后他米饭要做好了,对不对?所以说你如果不使用现成的话,他需要八秒加六秒,需要十四秒,对吧?我们把这个 把这里改一下,叫做饭做菜的时候,因为,呃,他在所有的方法后面,对吧?他在所有的方法后面, 你会发现这个方法开始了,这个县城开始了,然后这个县城也开始了,然后他又去执行了,这个并没有阻塞这个过程,对吧?好,我们再来一个 task。 呃,这个是做热菜是吧? 炒菜, cook, hot dishes, 大概没有这种说法,我这边写只是为了让大家理解一下。做热菜 hot 热的,对吧? 等于六一个,不是六个,等于 task 点 factory 点 start new, 那么同样里面也是可以传一个 lamba 表达式。 那么做热菜需要多长时间呢?做热菜需要冷菜用了六秒是吧?热菜我大概用个五秒就差不多了。 开始做热菜,然后呢? sorry 的点实力五秒钟,我这个炒菜速度很快,五秒钟就做完了, 青菜和牛肉准备完毕。 那这个需不需要 start 呢?来看一下啊?这个的用法相当于那个现成词的用法,对吧?好,走,你 开始做米饭,开始做冷菜,开始做热菜,谁先好啊?热菜先好,因为他要五秒钟嘛,是吧?青菜和牛肉准备完毕,然后冷菜也做好了,然后呢?米饭也做好了,对吧?一起做效率就是高啊。 嗯,烧个汤,好吧, make soup, don't you task the round。 开始烧汤, thread then sleep。 汤大概三秒钟就可以好, 番茄蛋汤准备完毕。那这个也是不需要四大, 对吧?来,再看一下。开始做米饭,开始做冷菜,开始做热菜,开始烧汤。好,饭店蛋糕准备完毕,先烧好的汤,然后呢?菜也炒好了,然后冷菜也准备完了,对吧? 好,我这边我除了烧饭呢,我还喜欢去做个咖啡哎,我们家有一台自动的咖啡机,他只要把豆子放在里面,他自己会磨咖啡豆,然后呢?把咖啡做出来,假设我们这个过程需要十二秒啊, 如果你对这个县城后面不需要干预的话, 是不是前面的这个他是个定一个这个他是个对象,也可以省掉啊,对吧?那么我们这边就给他省掉啊,他是个店 run, 开始做现磨咖啡, throw it down sleep。 这个要十二秒。 咖啡做好了,好香啊。 好,我们来看一下啊。做饭的时候我还在跟别的事情开始做菜,跟着汤做好了,是吧?青菜牛肉 好了,冷菜也好了,然后呢?米饭也好了,然后再等等,哎,咖啡也好了,好香啊,对吧?好,那么这些东西都做完了之后呢?我是不是可以吃饭了,对吧? 开饭了, 好吧,所有菜做好了,我开饭来,走你。你们发现个什么问题? 做饭做菜的时候我还在干别的事情,开饭了,但是呢,菜还没做好,对吧?是不是跟我们上次的那个讲的 threat 点 join 一样的问题啊?我们之前是使用 thread 点 join, 让这个县城 等待一下,是吧?等待上面的任务都完成了,我才能吃饭,对不对?那我开饭之前必须让这些菜都已经做好,对吧?好, task dead weight all。 这个 wet or 是什么?等待提供的所有 task 对象完成执行过程,那么里面是传一个可变长度的 task 数组,对吧?那么既然是可变长度的,来我这个做米饭是什么? coco, rice, 对吧?走,你是不是现在就不吃了? 哎,我现在就不吃了啊,番茄蛋汤好了,菜也好了啊,米饭好了之后他直接开饭了,对吧?哎,直接开饭了,咖啡也好了。那如果我把这个时间换个短一点的呢?比如说我换成一个三秒钟的烧汤的,我把这个麦克素拿过来, 是不是番茄蛋汤一好了之后我就吃饭了,其他的菜还没烧好,对吧?哎,其他菜也没烧好, 那这样的话,我如果想等待多个任务呢?一个,你就是说我把最长的一个放进去,最长的这个十二秒的完成了,那么其他的也就完成了,这是一种方法,对吧?那么我也说过了,你在实际开发的时候,你没有办法去判断哪一个任务他花的时间是最长, 所以你很难把一个花费时间最长的把它放到里面去。呃,你如果要等所有的菜全部都做好的话,你可以这样啊,先把这个 christ 放进来啊,米饭,对吧?然后呢?冷菜也放进来, 是不是可以?他可变的吗?对吧?好,热菜也放进来,然后呢?汤也放进来, 我不用等咖啡做好了之后再吃饭,对吧?所以咖啡需要放进来吗?不用放进来啊,菜好了之后我就开吃好不好?那么米饭 我等米饭做好,等凉菜做好,等热菜做好,等汤做好,哎,我就可以开吃了,好吧。呃,这个咖啡我们不用等他来走,你 好,烧热菜,烧汤,磨咖啡,做冷菜哈,番茄当当好了,青菜牛肉也好了,冷菜也好了,米饭也好了,好,开饭了是吧?这就是一个多线城当中你控制它的这个过程,那么有一种情况是这个样子的啊, 我这个饭好没好我先不管,我只要这个青菜牛肉烧好了之后 我就开吃啊,我就,我就只吃菜,我吃菜的同时,对吧?你的这个汤随便你去煮啊,你的这个这个冷菜啊,随便你去做,我反正有一个 菜好了,我就先把这个菜端上来吃,可不可以?好,我们先把这个粥吃掉。 tasks do you wait any? 我里面传什么呢?我还是传这些东西, 煮米饭呢,我们需要六秒啊,热菜,冷菜呢? 煮米饭呢我们要八秒,是吧?然后冷菜呢需要六秒啊,热菜呢需要五秒,汤呢需要三秒。我说这些菜里面任意一个菜先好,我就开吃,那肯定是汤先好呗,汤只要三秒吗?对吧?所以汤一好我就开始吃饭,这叫 wait any, 只要任何一个 ok 了,我就开始吃饭,来,走,你看看谁先好,番茄当当好我就开吃,对吧?哎,然后其他菜也好了, 好,咖啡也好了,对吧?好,那么我如果不想等这个汤呢?前面这个 米饭我也不想要,冷菜和热菜只要有一个好了我就可以吃,对吧?啊?我弄点小酒好了,对吧?好,走,你 谁先好啊?肯定热菜先好,因为他五秒吗?凉菜六秒吗?对吧?汤好了,我现在不吃好青菜和牛肉好了,我是不是就可以开饭了?然后冷菜也好了,然后米饭也好了, 咖啡也好了,对吧?好,那么回顾一下这节课,这节课呢,讲了什么是 tousk touch 呢?它就相当于 three 加上 three 的破,对吧?那么创建一个 task 有三种方法,一个是创建一个 task 对象,然后呢,使用 task 对象点 start 来标记他的教学状态。第二个呢,直接 task 点 run, 你还要去 start 吗?不需要了,对吧?不需要 stat。 第三种呢,是用 task 点 factory 点 start new 啊,在这种情况下,我们也不需要去使用这个 start 的方法,它会自动去执行,对吧?所以它跟这个第一种它是有区别的啊,那么第一种它是在你需要的地方,你可以去 start 底下这两种你可以去控制他的 stat 吗?不行,对吧?哎。 然后呢,我们在这个县城的执行过程当中,对他的这些哪个好,哪个美好,先做什么再做什么进行了一个 呃,可以说判断吧,他有两种方法,一个是 wet or wet or 呢?是等待所有只要你传进来的这方法,传进来的这些县城啊,传进来的这些县城对象就是 task 对象, 全部都好了,我才会执行下面内容,那么维特艾利呢?艾利是任意一个,对吧?那么只要等待里面这些现成任意一个好了,我就开始执行下面的内容, 非常好用吧,对吧?我们没有办,没有必要去设置什么前台县城啊。呃,这个,那个,对吧?你会发现这个 task 非常简单,非常好用,好吗?好,这节课就到这里,拜拜。
哈喽,亲爱的小朋友们和大朋友们,我是菲菲,这节课我们讲长任务于取消现成。呃,为什么要讲长任务?之前我们讲过了, task 相当于 thread 加上 thread 破,也就是说你这个创业的任务,可能他会被分配到县城池里面去,对吧?嗯,县城池呢?我们说随时用,随时释放,哎,用完就释放,对吧? 现身池用完就释放,那么有一些任务啊,他这个启动了之后,他一时半会不会释放,那他就一直占用这个现身池的资源,所以说这些任务他是不适合放到现身池里面去的。 那么怎么让一个 task 不放到现在纸里面呢?哎,创建任务的时候给他一个参数就行了,就这么简单。好吧,什么样的任务是长任务呢?来看一下,我们说这边有一个窗体,然后这个东西呢,是一个文本框, 给他改了个名字叫 text message, 那么这里有个有两个按钮,一个叫开始叫 button start, 一个叫中指 button about, 对吧?好,我们先写一个方法, 比如说 why the show message, 就是在那个文本框里面分别输出这个一二三四五六七八九九,就一直往下输, 写个方循环,哎,从零到一千,那这个任务是比较长的,对吧?哎,如果 invoke required, 那么就 invoke, 那第一个参数是 event handle, 第二个 delicate 后面大括号 this dentist message dent text 加等于 i 点破 string, 再加上杠啊杠 n 就是换航服。 好,每一条文本显示间隔呢?是,比如说三百毫秒吧, threaded sleep 三百毫米。好,我们去这个开始按钮里面给他写上 task, task 等于 new task, 那么我们把这个方法给他传进来,对吧?啊?之前我们可以直接在这个参数里面写啊,在这边写个拉姆达表达是就可以,对吧?那么我们因为后面要跟参数,所以这样写呢?能够让大家看得清楚一点。 pass 给点 start 来,先走一遍,看看有没有问题,别写半天,他有问题白写,对吧?零一二三四五六七八九,走起来了,没有问题啊,关掉, 有的时候关掉他会爆错啊,就是说你的线,你,你的这个程序都关了,是吧?但是县城还在访问这个窗庭里面的空间, 所以你窗体一关,把资源被释放了,你去访问一个被释放的资源,肯定会报错的啊,这种情况有啊,有时候他会报错,那怎么去解决这个问题呢?我们以后再讲,好吧。 好,我们在这个踏四个这边啊,就在这个踏四个这边,鼠标点上去点他,然后呢按一下 f 一,哎,他出来一个微软的官方文档,哎,他是个累,在左边呢,他是个底下有个构造函数点他, 你看到啊,他有多个虫仔。第一个是 task, 后面直接跟 action, 我们写的这个是不是就直接跟着一个 action 啊,对吧? 有人说这只是一个方法,这个只是微软给你包装了一下,对吧?啊?只是微软跟你包装一下,你实际上要写, 你得给他写成什么? new action, 然后 show message, 你真正写的时候是不是应该写成这样啊?嗯,语法上应该这样写啊,这个只是微软提供给你的便利,对吧? 好,呃,这个也不用说了,这个我们都讲过了,这个 action 后面盖个 cancellation talking, 使用指定操作和 task 初始化新的开始类型 token, 然后这个它是一个现成取消标记。我们稍后会讲啊,这节课稍后会讲。好,再看。这个 action, 后面跟了一个 task creation options, 他说指定操作创建出手了,这个我们不看啊。好,他后面可以跟一个他 ask creation options, 我们右键转到定义,看一下它是一个美举,对吧?哎,美举的指拇是固定的了。好,我们把它关掉,直接在后面点,你看他这边有一个 long running。 嗯,看一下他的这个注视指定任务将是长时间运行的。吧啦吧啦,后面就不看了啊,后面就不看了。就是说你如果这个任务,这个县城你是长时间运行的,就记得把这个参数给他加上就可以了。好吧, 如果任务是长时间运行,创建 task 的时候加上参数这个东西。 呃,有人说交案参数运行起来有什么不一样吗?没什么不一样啊,他只是不把这个县城创进到县城池里面去,其他还是一样的啊,其他还是一样的。哎,你看报错了吧,是吧?他说这个无法访问已释放的对象。 啥叫无法访问已释放的对象?你这个程序都关了,你这个东西空间都已经释放了,对吧?然后我这个县城还去访问啊,他总有一前一后的这样的情况,对吧?所以他就报错了啊,现在这个很正常啊,这样报错很正常。 好,我们讲完这个东西之后呢?然后讲怎么去取消这个县城,取消这个县城呢?我们来看一下他还有一个承载,就是说第二个他有个这个,第二个他有个 cancellation token 这样一个东西,我们点这个开车类型 token, 他说是一个结构啊,结构就是 structure, 是吧? struct structure, 传播有关应取消操作的通知啊,他会传播一个通知。嗯, 这个 structure 可以当作对象去遛一下它,但是我们为了便于它操作呢?我们会使用它视力里面这个 cancellation tokensaws。 这个东西。 好,那怎么用呢?大家看一眼就明白了,去自己去做一遍就明白了,没必要深入去了解。好吧。第一个,首先在他的这个成员位置就是累的,累的里面啊,这个累的里面 private cancellation consolation tools cancellation tokensaws, 等于你有 cancellation tokensaws, 这是一个创建 cancellation tokensas 的对象,对吧?好,把这个对象拿过来,我们看一下他参数的位置啊,你看 cancellation talking sauce 是不是在第二个参数,第三个参数才是那个 task creation options, 对吧?所以你要把它放在第二个顺序,不能错啊。 好,第二个我们要在这个地方打一个逗号,把它放在第二个,那么我们要的不是这个 cancellation tokensaws, 我们是要 开始类型偷坑少,是对象里面的那个偷坑,所以这边点偷坑就可以了。好吧,那取消。怎么取消呢?我们找到这个终止按钮,双击他在里面写入代码,把这个对象拿下来,调用一下他的取消方法。 castle, 哎,现在就取消掉了,方便吧?好,大家看啊,可能这个结果跟你们的预期不一样,我们脸开始跑起来了,对吧?中指,你发现中指不掉,为什么中指不掉?他只是向偷啃通知了一下啊,像这个开始内心偷啃通知了一下, 真正你要取消,你还要靠手动去取消啊,当你获取到这个通知的时候,手动去取消,怎么去取消呢?当你调用这个方法的时候,这个放循环是不是一直在执行啊? 什么时候就不要执行了呢?或者说他什么时候执行呢?好,我们在这个放心款里面加个判断,如果,如果谁,如果这个 cancellation talking source, 点 这个 is cancellation requested, 获取,是否取消?或许是否请求取消?此开始类型, tocosus, 是吧?哎,你获取一下他这边看上了之后嘛,这个肯定就看上了,对吧?那么他取消了之后,是继续执行这个代码呢? 还是不执行这个代码取消的更就就根本就不应该去执行这个代码了,对吧?那么没有取消呢?没有取消就执行吧,所以我们可以把这个结果这个判断在前面加个感叹号,给他取反,给他取反。然后呢, 你把这个贴进去。好,我们再来看一眼这个意思啊。首先县城关联了这个方法,对吧?然后呢,这个方法里面有个放循环, 这个放循环会持续的输出数字一二三四五六,那么什么时候输出呢? cance, 内心 tocss 没有被取消的时候,就正常的时候他会输出。 一旦说他这个被取消了,被取消了之后吗?这一块就不会执行了, 对吧?大家好好体会一下。这个都是以前学过的东西啊,都是学过东西。 cancellation to cancels, 点 is cancellation requested 表示是不是请求取消啊?是请求取,请求取消就不会执行,明白了吗?你如果不行的话,把这 一个感叹号去掉,后面等于一个 boss 也行啊。好,我们来看一下, 走,你跑起来了,对吧?中指停下来了,有的人停不下来, 你记得啊,有的人停不下来,你记得这个一、不要写到 fo 外面去写到 fo 外面只会执行一遍,写到 fo 里面是每一次去循环都会被执行, 如果执行一遍的话,你你在这个位置执行过了,那 for 还是一直在执行的,对吧?所以这个位置不能写错啊。 好,县城取消掉了,我能不能继续运营起来?我点开始行不行啊?不行,对吧?不能,对,已完成,不能对已完成的 任务再去吊用它。好,你看啊,我这个按钮是创建的新的任务,对吧?你怎么知道我这个任务已经完成了, 是不是里面传那个开始类型 tocos 啊?我们这个开始类型 tocos 是在哪里创建的?是在这个类里面作为一个类成员创建的, 如果你点了这个宗旨,那么凯瑟雷信托克斯老师就被标记为宗旨了,就他就肯定是完成过的,对吧?既然是一个完成过的,那你这边就不能重新启用,怎么办呢?我们把这个东西啊, 把这个创建对象这一步拿到下面来,在这边只是说我创这个成员对象或者叫成员变量,实际上呢?我什么时候 在这个按钮里面去创建?等于你有一个开始类型。偷看手势,来,再看, 开始跑起来吧,中指听到了吧?再开始。是不是又从零开始跑起来了?来,再中指,对吧?再开始, 再中指,好,怎么去开始一个县城,然后这个县城是不是需要长时间运行?怎么去中指?掉他中指完了之后怎么去启用一个新的县城? 这节课都已经讲得非常清楚了好吗?好,大家好好去消化消化,理解理解。特别是什么是长线城,就是长任务啊,然后怎么去取消,对吧?哎,这个可是人心透, 克萨斯一定要理解一下。还有这个判断啊,如果凯斯雷逊托克萨斯已经被请求了,那肯定是不会执行的啊。那么加个感叹号,表示取反。如果他没被请求,那我就执行这个,对吧?好,那这节课就到这里,拜拜。
呃,大家好,我是三七,今天跟大家分享一下多县城相关的知识,其中包括 renable, collable, future 以及 future task。 话不多说,点个关注,把头埋底,我们开始上课 啊,很多小伙伴认为这个软 naple 啊,其实是一个县城,其实它并不是啊,它只是一个接口,而且是一个非常简短的一个接口,我们看一下它的代码, 它的代码呢?只有这么简短的一个三行代码继承它 runnable 接口呢,需要实现它的一个软方法 哦,我们为什么要实现这个 run 方法呢?比如说我们想一下我们创建这个县城的目的是什么?就是为了实现通过一个新的县城实现一个业务逻辑, 这个软方法中包括的就是一个业务逻辑的一个实现,这是我写的一个简短的一个代码,很简单啊,因为这个妞色的, 嗯,是这个 new 色的是,嗯,构造方法呢,就是可以传入一个 runnable 接口。呃,因为 a renable 接口只需要实现它的一个。呃, run 方法,他只有一个方法,所以我们可以采用这个栏目的表达式进行书写,然后其实他就是建立了一个实力,然后打括号的内容呢,就是 real 方法的一个实现。 嗯啊,创建一个新的县城呢,我们需要调用它 star 的方法,然后 star 的方法呢?这里呢?呃,其中调用它的 star 的零方法,然 然后再来到他的四二零方法呢,我们看到他有一个呃, native 休息, native 休息,其实就是他是用 c 语言写的,其实我们不用太在意,他只是让这个四二零方法呢,就是让一个县城啊去开启当做就绪状态,然后 到 cpu 轮到这个时候的话,他就会自动实现他的一个乱方法,然后这时候我们就可以调由我们这个 readable 方法里的乱方法就可以实现业务逻辑了。 呃, colo 报接口呢?它是一点五版本实现的,一百五五版本后出的,我们看一下它这个注视啊。嗯,我们呃要学习一个新东西呢,一定要看它的注视。这个写的是 col 考 a 报方法呢,类似于 这个 rendable 方法,他们都是被设计的用来去。呃是呃是另一个县城的去执行的,我们有了这个 read rendable 这个接口,为什么还要这个用这个 connable 呢? 我们看一下这个啊, condobo 接口实现的靠方法呢?他其实是有返回值的,然后 renobo 实现的这个方法呢,就是没有返回值,这就是他俩的方法,这下会了吧?啊?如果我们那个 这下有人问你 runnable 接口和 comfort 接口都会了吧?啊?那么我们自己可不可以创建一个接口,比如说创建一个三七三七呢?不 啊,这个是当然不行的啊,因为命名规范,不许允许用这个数字开头进行创建的。
哈喽,亲爱的小朋友们和大朋友们,我是菲菲,这节课呢,我们来讲 task 的返回值。那么上一节课其实我们已经讲了这个 action 里面传参数,然后结合前面学的 three 的呢,这节课应该是一点难度都没有啊。好,我们先来写一个方法,由于我们是在这个 man 方法里面执行的,那 man 方法是一个 static, 是个静态方法,所以要求他的成员也是静态的 static。 呃,我们写的方法有一个返回,只是 inter 类型的,返回什么呢?返回一个 my number, 这个 my number 呢?到什么参数都没有,然后就 return 一个八,好啊,这个方法是不是非常非常简单,对吧?我们这个, 呃,教学讲的越简单越越容易懂。好吧,好,我们来写一个 task, 好, 把鼠标点到上面,按 f 一,按 f 一之后,你看啊,你左边有一个 task, 这个 task 的构造方法刚才我们已经看过了,对吧?它里面全是 action 的,那么 action 是一个没有返回值的委托,我们所以不能用 action。 你看左边列表这边还有一个 task, 后面有个 t result 的发型。好,我们点它,然后再点高杂函数,你可以看到它里面就不再是 action 了,它里面要求的全部都是 t result, 发型 能有几个?只能有一个,只能有一个就表示什么?表示他是返回职的类型,对吧?啊,不清楚的同学回去看一下委托啊,把前面的委托 看一看。所以说委托这个东西用的非常多啊,用的非常频繁。好, task 后面跟了个 t result, 然后后面跟的是什么委托啊?是放口委托,对吧?放口委托有反位置,反位置什么类型啊?就前面的 t result, 明白了吗?然后再往下,他有这个 fuck, 后面跟了个 object 参数,对吧?然后有 t result 啊,它有两个,那一个是参数,一个是返回纸, object 这是参数, t result 是返回纸,对吧?好,那它后面还跟了一个 object 的这个,它是 方可这个方法的一个参数啊。方可这个方法的参数,我们一会会看到这个东西的,再往下看就是什么 cancellation 啊, task, creation, options 啊, 就等等,这些东西我们是不是都用过了,对吧?好,我们来把方法写一下啊,来,把这个 task 写一下。首先这个地方只能写几个?只能写一个,对吧?只能写一个,他是什么东西?是返回值的类型? 好,你看这个方法的返回之类是什么?是 inter, 那我们就把 inter 拿过来, task 等于六一个 task 高造函数,那这个构造函数里面应该填一个方法,对吧?好,填进去了,没有问题吧? 然后这个线程是不是应该被标记成启动啊?标记成就需啊。好,那么请问我的返回值从哪里拿?非常的贴心啊。他 result, 我们使用一个 inter 类型的值去接受一下。 inter result 等于 task。 dear result 没问题吧?返回跟 inter 类型的值。好,他说获取此 task result 的结果值,是吧?非常简单。来,走,你 一闪而过,让屏幕等一下啃瘦。对呀, red line 有人说啥也没有, 啥也没有,是因为我们没有把这个蕊让就给他输出去啊,不好意思啊,这已经夜里十一点 录视频,有有差错的吗?对吧?我们把这个瑞造的给他打印一下,然后让屏幕停一下,好吧,走,你是不是输出一个八呀?这个方法是不是给我们返回一个八呀?是吧?好,接着往下看,我这个方法有一个参数, 我这是一个 inter 类型的 a, 然后呢?我要返回,把这个 a 的平方给我返回出来, a 的平方是不是 a 乘以 a 啊?好,既然是有参数的,那你这个地方是不是应该把参数传进来好, 比如说我们穿个四可以吗?不行对吧?他说无法从方法组转换成放,可 inter 返回还是 inter。 那么你前面我们看一下他构造函数,构造函数,他是不是要传一个 funk object? 哦,他是一个 object 类型,对吧?那么你这边就可以这样写了, new funk。 返回啥呀?返回 int, 什么类型的参数呀? object 类型的参数, 构造函数。把麦,那么这个方法给他关联进来,还报错,还报错,是因为为什么? 县城里面要求参数是一个 oppoject, 可是你是一个 inter 类型,对吧?所以你这边要改成 arbject, 那么这里没有 a 了,是吧? inter 个 a 等于什么呢? 等于墙转为 int, 把这个 obj 拿下来,是不是 a 就可以了?就有了,你看上面也不爆粗了,对吧?那么上面这一块能不能简写呢? 这一块能不能简写?我就把这个 my number 拿过来行不行? 买 number 拿过来是放在这个位置的,我们把它全部拿掉, 这样是不是看着很舒服?来,我们把这个复制一下啊,要把上面的注视掉,省得大家不会写了。好吧, 这样是不是也可以啊?来,走,你把四传进去,四四 十六,没问题吧?好,没问题啊,好,我想要一个两数相加的,这个用现成来做做做一个这个两数相加的这样的一个方法, 我们都知道啊,这个地方只能传一个,对吧?只能传一个,所以你千万不要尝试。我说这个, 说我这边有个 oppojike 的,我传两个 oppojike 的,行不行?来,我在这个地方再加一个 oppojigongobj 二,这个 oppg, 你看这样行吗?不行,对吧?所以啊,你要两座相交的话,你可以去使用一个 数组,或者是使用一个类, 传一个三,传一个五,这是一个数组,对吧?好,那我们把这个数组给他传进去,就没有这个啊,不接,可能没有这么多东西啊, 我们把这个 a 二二给他传进来,传进来了之后我们是不是要对他处理一下? 呃, int 一二二, int 等于强转,还是要的,对吧? 这是拿速度去接受,哎,写错了,拿速度接收回来之后就已经拿到这个速度了吧,对吧? inter x 等于数组的第零个元素, inter y 等于数组的第一个元素,然后 return 什么呢? return x 加上 y 走,你三加五是不是等于八?哎,这个就是我们使用多线程,然后 去关联一个有返回值的这样一个方法,那么对于这种方法啊,对于有返回值的这种东西,我建议大家还是去用异步,对吧?啊?去用异步,嗯, 所以这个东西你如果使用这种多线程 task 去做的话,呃,一定要考虑清楚,好吧,这个总的来说这些歌没什么难点,都是以前学过的内容,对吧?好,那就这样,拜拜。
哈喽,亲爱的小朋友们,大朋友们,我是菲菲,这节课呢,我们来讲 task 现成,他的这个 awaiter 算是一个现成的回料函数啊,我们创建一个控制台应用,下一步创建 好。你看啊,我这里有一个 c 害方法,方法应该写在哪里啊?写在那里面,对吧?那么由于是在这个 man 方法里面调用的 man 方法是一个静态方法,所以你写的这个方法必须给大家一个 static 啊,我每次写到这里都得讲一遍,是吧?你们自己要注意啊,别写了个方法说,哎,我怎么我都跟你一样,写的方法内容都是一样的,怎么就不能吊用你加上 static 啊,没有返回纸 say 嗨,这个方法是个老演员了,对吧?每次他都出现 我是 c 害方法。 好吧,那么以前我们是直接把这个 sea 拿过来调用一下, 少点 red line, 我们是直接拿过来调用一下,没问题啊,我们今天拿现成去调用。这个方法怎么写? 很简单,对吧? task task 等于扭一个 task, 然后呢?把它传进来, 那么假设我这个方法号是比较长 thread, 我们要他休息三秒钟, 如果县城没有阻塞,就说出了,我就说出了这句话,对吧? task then start, 这没有问题吧?由于上面这个不会阻塞县城,所以这句话可以被先说出出来。 如果你上面没有像我们现在这样去写现成,比如说,这样啊,你是直接吊用的这个方法, 看好这个方法就耗时三秒,所以这个光标会停在这边一动不动,直到他调用完这个,我是 ci 方法之后才会去执行这个。如果县城没有组织就输出了,我,对吧? 啊?才会去执行这个,那么如果你使用这个帕斯科去做的话,他会另开一个县城,他就不会挡住这句话的输出来看一下。 好,他说先说出,如果现成没有读的就说出了,我过三秒,他说我是谁?还有方法,这个都是这两天讲烂了的知识点啊,这个一定要能看得懂。好吧,好,我说当我这个县城执行的这个方法完毕了之后, 我要继续去做一件其他事情,那么你不知道这个方法要花多长时间去执行。哎,有人说,你看,有啊,这不是三秒钟吗?对吧?这个只是我举一个例子,你在现实开发当中,你知道这个方法他需要 多长时间才能执行完吗?不知道吧?他执行一个任务所需要的时间可能是不固定的啊,那么在这种情况下,你没有办法说 我这个已经斯大特了,斯大特完了之后,我再在底下再写代码,再写代码他会在主线城里面去执行,对吧?你这个呢,是新开的县城里面去执行,所以你并不知道这个方法什么时候去完成啊?什么时候已经完成。 既然你不知道方法什么时候已经完成,你就没办法说在这个方法完成之后,我再去做做点其他事情,明白了吧?有人说,可以啊,我在这个方法里面再接着往下写不就行了吗? 那这个方法如果是一个有反位置的方法呢?有反位置的方法 return 了之后还会 执行下面的代码吗?这是技术知识啊,有反位置的方法 return 之后,下面的代码就不会被继续执行了。就是说我这边如果 return 什么什么 abc 的话, 你在这个底底下打的这些代码他通通不会被执行啊。瑞腾,完了方法就结束了。好吧,所以你没有办法说,我就接着这个方法,我就在里面接着写。 那这个就是说我们为什么要去用回调函数?回调函数就是你县城里面这个方法一旦完成,我就去执行我指定的方法,这个叫回调方法,也叫回调函数,明白了吧?啊?要明白回调的这个意义在哪里啊? 那怎么去做一个回调呢?我们使用这个 task, task await, 不用去遛啊,不用去遛,我们直接把这个 task 拿下来,点 get awater, 你直接六他就跟这个 task 没有关系了,对吧?啊?你从这个 task 里面 get 出来的 awater 跟 task 是有关系的,对吧?他娶的是这个 task 对象里面的 awater。 好, task awaiter than uncomplete uncomplete 里面要传一个 action, 那我们写一个 action 就行了。写个 action 来,我们 先去看看他要什么样的 action 啊。转到定义 uncomplete action continuation, 对吧?那这个时候你往里面传的就只能是一个 action, 这个 action 它是 有参数吗?没有参数。有反位置吗?没有反位置对吧?无参无反位置啊。 static avoid my call back。 这是不是一个无残无返回纸的说出一句话,我是毁掉函数, 我们把这个拿过来放到这里走。你好,如果现现在没有左侧就 说出了我啊,我是 c 害方法,然后呢?执行的回答函数没问题吧? 没问题啊,所以这个最简单最简单的一个回答还说一定要会用,好吧,一定要会用啊,要不然你想跟在这个县城后面,让他执行完了去做点事情,你就不知道怎么下手,对吧?好,再看啊,那么这个方法他没有返回职, 我们来写个有返回纸的方法, static in my number, 那么由于这个方法要传到县城里面去执行,所以他传进去的必须是 object, 对吧?好,拿下来的时候 in number 等于强转 return 这个数的平方,好吧,乘以 number 就是传一个数进来,我把这个数再乘以他自己,这不是这个数的平方的吗?把这位腾出去,好吧。好,上面的这些我们给他注视掉,就照着上面写,看看区别在哪里。 task task 等于你有一个 task, 里面传一个方法 my number。 好,这里他就开始报错了。为什么?这个是有返回值的,我们说有返回值的,你的 task 应该要放行,对吧?返回一个 这个地方也是的,返回一个 inter, 那么说这个方法你要传一个 optic 进去,在这个地方我们比如说传一个四, 好,我错了,对吧?好,接下来 pass 个点 start。 好,就是这一步也没错,对吧?好,那接下来还是一样的,如果县城没有阻塞就输出了,我 这个上面都是一样的吧。好, task await task await task awaita 等于 task 点 get await 来看一下这个地方又报错了, 他说他是个威特,也要用发型,对吧?那简单,你这个地方改成 inter 就行了, 是,不?不不,报错了。 好,接下来他是个 av 点 on complete 这个地方,我想把 my number 这个结果给它输出出来,但是你看啊,我们刚刚说的它传进来的这个 action, 它是一个没有参数,没有返回值的,既然没有参数,没有返回值,我们怎么取到它呢? 怎么用 action 去做呢?所以你这个地方如果在外面再写一个,比如说 static void my number call back, 你想把它输出来,把这个结果输出来,你这边是不是有一个结果在这边你才可以输出啊?说出这个麦瑞照, 对吧?可是你这个能放到这个里面来吗?他要求的这个 action 是没有参数的,对吧?你这是一个有参数的方法,所以你就没有办法放到这里来。怎么办?难不倒表达是吧? 首先我是回家,还说没问题吧, pass 个现成的结果为 task awaiter get result, 是不是这里就可以娶到他了?没有问题吧?好,这个完成了之后肯定是要点 read the line 看下代码啊,跟上面对比对比,自己写一写去体会体会。走,你如果现在没有阻塞就输出的,我是回头函数,他是个现成的,结果为十六, 对吧?好,如果说你要给他把这个时间给他拉开一点,我们可以这样子啊, three 的点实力,我们来个四秒钟 走,你如果县城没有阻塞就输出了我,对吧?过四秒钟他直进县城啊,我是回到函数,他是个结果为十六,没错吧? 啊?你说直行县城?我没看到呀, 我是 my number, 方法 好,如果现在没有走的就输出了,我执行了县城,我是县城蚂蚁。那么方法,然后呢?执行了回调对吧?回掉里面取出了 task, 结果是十六万,好,这个还有问题吗? 嗯,首先你要了解回调的意义在哪里,就是我为什么要去用回调函数?为什么?因为你不知道县城什么时候完成,对吧?你如果想在县城完成之后要做点什么,那么你就必须要用回调函数。回调函数有可以没有返回制的, 也可以有返回纸的,那这个回调还舒服,怎么去写怎么去传?好吧,这节课就把这个就讲清楚了,大家动动手试一下啊,拜拜。
创建县城有哪几种方式?准确来说,创建县城只有两种方式,第一种通过所有的类来创建县城,第二种通过创建县城时来创建县城。下面两种方法,王伦 a 国跟国内 a 国都不能直接创建县城, 都需要通过 siri 包装或者提交到现成词来创建现成。每日一问,为什么不推荐直接 nosiri 的来创建现成呢?
好了,在前面的课程中呢,我们已经为同学们呢介绍了多线城,然后呢也看到多线城的一个直行情况,他是多条线城,是不是在徒日执行啊?但是这个县城在底层到底是具体怎么去执行的?这个原理是什么样子的,其实我们并不清楚, 那么我们的线程呢,在底层呢,其实是并发和并行在同步进行的,那这个并发和并行到底是什么意思呢?好,同学们需要掌握这两个概念,你才能真正明白多线程在硬件上是怎么去运行的。 好,我们先来理解一下并发并行啊,他说正在运行的这个程序呢,其实是一个独立的进程,也就说你要先理解进程这概念,才能理解并发并行。 什么叫正在运行的程序是一个独立的进程呢?你说咱们写的加拿大吗?其实他跑起来是不是才是个进程啊?你看我们操作系统也有进程的概念,你把它打开在这里, 这是不是进城的,一旦跑起来就有进城啊,而县城是属于进城的,那么多个县城其实是并发与并行同时进行的,也就是说我们的县城是属于进城这个区域啊。那么大家一定要注意, 并发的概念就来了,那么什么是并发呢?为什么说限制是并发行呢?他是这么说的,他的 cpu 同时处理现成的数量是有限的,你们一定要这样,我们 cpu 同时处理现成的数量是受你的什么, 是不是受你的 cpu 的合数的这个影响。有的人比如说买八盒的 cpu 啊,整整这个,你看我这个,我这个电脑呢,他的,他是四盒的,逻辑处理器是八 好,那么他是四合,然后呢?逻辑数据是八,相当于呢?你可以认为他每次是不是可以处理八条线程呢?明白,我的意思就是每次只能处理八条线程,那 想一个问题啊, cpu 既然每一次只能处理八个县城,就是同时能够并行八个县城,那么他我们电脑里面可有没有可能只有八个县城呢? 肯定不可能,你想到我们自己创建的县城池是不是都可以搞十来个县城的,所以他不可能同时把所有的县城跑完,但是他是不是又需要把所有的县城跑完呢?那他怎么办? 他就会并发来进行完成。那什么是并发呢?他的 cpu 会能寻味系统的每个现成,由于 cpu 切换的速度很快,给我们的感觉这些现成在怎么样同时进行?那么这就是并发好,什么意思呢?假如我是一个 cpu, 我现在是一个逻辑处理器, 意味着我每次是不是只能处理一个县城呐?那么现在同学们都是县城,你们有九十个县城,但是我每次只能处理几个学生呐?一个好。假如说我 现在呢,要打每个同学五八的,举个例子啊,不是真的打,要打每个同学五八的,那我怎么样才能让所有同学都被打起来?我是不是从第一个开始打,然后打的速度特别快啊?那么感觉整个班的学生是不是都要被我打呀?那就认为你们在被我怎么样?你们在被我并发, 听懂了吗?所以我们的县城他不是每时每刻都在执行的,他是由 cpu 是不是能行来执行的?好,那并发我们就理解了。你看了,比如这个 cpu, 他可能先为,假如百度里面有现成的话,先找百度里面现成服务,有可能为他服,有可能为他服务,那这个是不是这过的是不是并发啊? 好,那并发讲完了,大家要理解并行,什么叫并行呢?我刚说了,假如我是一个逻辑处理器,我是不是每次只能处理一个学生呢?然后我从第一个开始打,打到最后面 打的非常快,所以你们都叫并发,对吧?那么并行什么意思呢?就相当于我从我的头上 拔七根毛出来,但是我是不舍得拔的啊,假如说我拔了七根毛,一下子变了七个我,那总共加加我是不是就是八个我呀,相当我的 cpu 是八个逻辑处理器,那我同时能够并行几个学生? 八个,也就是说每在时间维度上,我一刻确实可以,是不是同时打八个学生?哈哈哈,能理解了吗?那我以后会怎么办?我会每八个八个八个的打,是不是就 是并行和并发在同步进行的?那整个班是不是感觉都在被我打呀?而且是不是打的更快呀?原来是要等等两秒钟 才被打,现在是不是很快就被打了?因为他每八个八个切换的更快,所以你会发现 cpu 的合数越快越多。 你们电脑是跑的越快啊,电脑是不是也越贵啊?好,现在明白县城的执行原理了吧?那么一句话说,县城是怎么在执行的?县城是在被 cpu 并发和并行是不是同时在执行的? 能理解这意思了吧?每刻并行是不是依赖于 cpu 的处理能力,而并发是在什么时间维度上是分时执行的?好,那我们呢?就说完了并发,那你看他这句话就是这样的,他可能会先让 cpu 执行什么,是不是执行这四个了,然后下一等怎么样?是不是执行另外四个呀? 每次执行的四个是并行,然后呢?每四个,每四个是不是并发呀?就这个意思啊?好,我们来总结一下,简单说说并发和并行的含义。并发是什么意思啊?同意时间大,是不是抢占 cpu, 直营自己啊? 什么意思呢?他是这样的,在同一个时间段内,也就也也也就这个地方的歧视呢? 好,那并发者是 cpu, 是不是分时能巡的职业现成的?比如说我们是九,同学们是九十个县城, 我是一个 cpu, 然后我是一个假设,我只有一个处理器,一个我的处理器,我是不是一个一个的访问?你们这是不是就是并发呀?但是谁先被访问,谁后备访问,这个事怎么样 随机的,明白我意思了吗?而并行依赖于 cpu 的什么处理能力?同一个时刻同时在执行,是不是叫并行啊?假如我有八个逻辑处理器,意味着我同时能够并行什么? 八个,而且每个东西就是代表一线城的话,我是可以处理八个同学的。这样并行啊,那多线城一定是并发,而并行再怎么样是不是在同时推进呢?啊? 就说到这,好的,接下来呢,我们来为他们补充一个知识,叫县城的生命周期。那么为什么要在这里去讲县城的生命周期呢? 因为我们的县城呢,是从这个创建到启动,以及他执行到最终死亡,他是不是都有一些状态啊? 你要理解这个县城的生命周期的话呢,有利于大家理解多县城的职业流程,同时呢,县城的生命周期也是面试的热点,所以我才来讲这个知识点啊。那咱们呢,来认识一下县城的生命周期。 其实县城的生命周期指的就是县城的一生中的各种状态。其实咱们人呐,也很像一个县城,他也有个生命周期,比如说你出生 是不是一个状态啊?是,然后怎么样?你长大是变成了一个单身的,就像你跑起来的,是不是成为单身的,然后呢?你可能结婚的是秃顶的, 然后最后你是不是积极了,对吧,那就是拜拜了,对吧?那这是人一生中怎么样?是不波澜不惊的一生呐,平淡无奇的一生,这是个正常状态,但是呢,你一生中也可能会有一些风险,比如说,你是不是也有意外的状态呀?哈哈哈, 对不对?老师再也恢复成单身了,被绿了以后肯定要恢复成单身吗?对不对? 尤其是男孩子,对吧?好,那这是一个人一生中的状态,其实咱们的县城呢,他也有一很多状态好。对啊,县城状态也是 从生到死的过程,以及中间经历的各种状态及状态转换,这是大家需要知道的,因为有的时候呢会被问到,那么我理解现成的状态呢,有利于提升并发编程的理解能力。并发编程啊,就是多线人编, 听听明白了吧?并发就是同时干很多事情吗?在一段时间段内,我们刚刚讲过就是多样程编程啊,那大家想一想 我们的加法,他的现成状态总共有几种呢?其实应该是有六种的是吧?好,这六种呢,也不是我们想出来的,实际上是有加法,他规定的加法呢,在思维类里面提供了一个美举类叫斯贝塔, 这是现成状态的意思,这是个霉菌类,这个霉菌类里面他规定的现成的状态总共有六种,这人家官方定好了,所以他只规定这六种状态,他会在现成的事实的这个执行过程中呢,去标记这个现成状态,只是我们现在用不到的状态而已。 实际上这些状态是给加了什么内部去做一些控制使用的,比如说有的现在处于阻测啊,有的时候现在处于等待啊,他可以去标记的,只是我们没有用而已,但大家知道有这些,那是不是有呢?咱们可以大 ad 中的 看一看,你可以直接找个地方写个代码,叫斯外的点斯,带他 stat, 他是一个大写的, 然后点进去,他是放在所有县城内里的,一个内一个内内部媒体内里面的,他规定的这么多啊,这么多状态,所以我写的这些东西呢,很专业,因为官方是不是就已经告诉我们了,没有比这更严谨的,那大家直接回来 是不是来了解这些状态啊?好,我给大家说一说大理介绍下,第一个,新建状态,第二个,可运行状态, 是不是代表已经掉丝大了?第三个,主色状态,什么叫主色状态呢?小红来取钱,但是小明是不是已经占了所呀?是,你就小啊,小红就进入主色了。 微定代表是无限等待状态,我们今今天讲无限等待状态的,他一旦掉了胃的以后他是不是就一定要等别人唤醒他, 别人不欢迎他启不启动了啊?启动不了,他们的规定代表是近视等待,比如说他可能会进入休眠状态之类的,对吧?这个呢代表是死亡状态,就代表已经终止了。那这六种状态呢?我已经拿这边来了,我们来分析一下 新建的是新建的新建状态是什么意思呢?比如说大家溜了一个 mace 瑞的是不是新建状态啊?新建状态只有加纳特征没有现成特征啊,就是你相当于溜了个加纳对象,你一定要掉丝袜的才能进入到一个什么 可运状态?为什么叫可运型呢?大 g 啊,我们现在是并发执行的,你启动了以后你是不是还要等 cpu 过来找你啊? cpu 找了你是不是才能跑啊?我说我们班是九十个同学, 那你怎么样才能让我来打你一巴掌呢?你是不是要等我呀?你说老师我已经准备好了,没用的,一定要等我到你这来你才能跑的,才能被 你的脸才能拍我的手一巴掌对不对啊?是这个意思啊,所以你所以说是可运行啊,不代表真的能跑啊。 好,那大家注意啊,可运行的状态的现成他一旦执行完毕或者出现异常是不是就终止了?记住人一生中正常执行或者怎么样 出了意外是不是终止啊?嗯,那么可运行的县城呢?他未得到所对象是不是进入所堵塞?比如说小明在运行他去抢锁的时候结果是不是小红把锁抢走了,所以他进入所堵塞,那他也能再次得到所对象,是不是继续可运行啊? 那么可运行呢?他可能会获得所对象之后吊用的胃的方法,他要先站所,然后进去做一些事情,做完之后的,按照试验者消费者模型的话,他站完锁之后,他是不是可能会进入无限等待状态呀?他干完这个事情不能再干,他就等待,等待以后他就进入无限等待,你就要 无线等待,什么意思呢?无限等待不是说人家释放锁你就能跑了?无限等待是不是一定要人家唤醒一样?对,而锁主册是这样的,锁主册是我在锁外面的 锁,一旦释放我是马上抢锁啊。对,无限等待,那那那,那有锁你也没用啊,你是要等别人把你唤醒了?对,所以一定要等。人家怎么样唤醒他。那其他现在唤醒的话呢?如果他未得到锁,是不是所堵塞,就是人家把它唤醒以后,他就要再竞争锁呀? 能理解这个意思吧?能,那如果人家把他唤醒,他得到锁,他就运行了。嗯,就这个道理,人家把你唤醒,你抢不到锁,还不是一样的阻塞,对不对?所以一定要注意这点。 那就要看这条线怎么样进入计时等待呢?你钓的是内部休眠的,是不是进入计时等待?然后呢?大家一定要注意啊,他钓的是内部之后,他是不会释放 锁的。限制休免是不会释放锁的。啥意思啊?比如说小明站着锁,然后跑进去睡觉了,那小红能不能把他锁抢走啊?不能,不能,私立不是不释放锁啊,他其实睡一天,你说在外面等他一天呢?那么还有一种方式会记住记事等待,叫味道好秒。 这个呢,我们没有,是没有学过这个,这个我介绍一下,他是什么意思呢?我们之前直接调位特,代表是不是当年进入这个无限等待啊?但是有的时候我们会在里面加个什么?加个时间,比如说我位特五千毫秒,代表我只等多少秒啊? 只等五秒,如果五秒还没有人唤醒我,那我就怎么样,我自己就醒了。听得懂了吧?就这个意思,只是没有用而已,你就要看长一点才能用的。那你看那假如斯利不时间到了,他就直接跑了,而未得时间到。好,这个字写的有点问题, 是时间啊,那喂的时间到了,并得了所对象,因为我说过喂的他他是会把锁是放出去的,喂的进入无限的,他会马上把锁让给别人啊, 所以为了之后的话呢,如果时间到了,他醒了,然后再有强所入得到所再跑。那还有一种情况是这样的,未得时间没有到,比如说我要等五秒,但是别人是不是也把我唤醒了?那是不是提前苏醒呢?提前苏醒我得到,所以后怎么办?是不是接着跑啊?好,还有一种情况是这样的, 喂的时间到就是自己就醒了,但是没有得到锁,是不是进入手指侧?还有一种情况是喂的时间没有到,但是别人把我怎么样 唤醒的?比如我要等五秒,结果第二秒被人唤醒的,那我是不是又没有抢到锁呀?他也会进入锁堵塞。好,这个状态可以互转,这个过程大家有没有问题?有,那关于呢?现成的状态我们就说到这, 主要呢是有这么多状态,我已经为他们做了一些记录,大家可以去参考一下,这边呢也有一些总结,是吧?好,大家呢可以把这个了解一下,我们呢就说到这这个。
什么越冷门的协议越好用?挑战一百期,让你从零到一,搞懂全屋智能,不讲废话,全是干货。第三期,无线智能协议的 mat 和 thread 到底是什么? 在 mate 出现之前,如果想要建立一套智能家居系统啊,就必须全部使用同一家品牌的设备,这会导致什么呢?没错,市场的恶性竞争,用户购买产品不再看什么产品力工号之类的了,而是以 品牌的设备生态大小作为唯一参考标准。这也导致市场上出现了很多有恃无恐的老油条,背靠大生态,但产品劣质。 同时呢,一些优秀的产品因为生态不大,很难有销量,于是互联网市场中也出现了裂壁驱逐凉壁的状况。而 matter 的出现,就像秦朝一统六国,让哥哥 国家遵循统一的文字货币栋梁衡。换句话说, mat 减少了物联网设备在各个平台之间转换的内耗,不用盯着一个品牌买了设备,只需要支持 mat 应用程协议,就可以识别不同品牌的生态, 真正实现了互联网。 internet of since 的含义,也就是万物皆可通过网络互联。基于 mat 使用的 wifi 和 shrine 的技术呢,叫 mat of wifi 和 mat of surrender。 打个比方,如果把 mat 作为是铁路交通方式, wifi 就像是高铁。 surrender 就像是地铁, wifi 具有高宽带、 高功耗的特性,就像高铁可以把你送到很远的地方,但耗时长,票价也会更贵。 strand 就具有低贷款、低功耗的特性,就像地铁,虽然只 在本地运行,但耗时短,票价低。但这两个支持 ip, 就像无论是高铁还是地铁都在轨道上运行一样,但由于种种原因呢, mat 在我们国家应用的还不是很广泛,只能算是热门。那什么时候能火起来那就要看上头的意思了。好了,我是峰哥,一个不一定能让你挣钱,但一定能让你避坑的人。
哈喽,今天来给大家分享我们生产上遇到的一个问题,我们来模拟出这样的一个问题,首先呢这边有一个线乘十,并且我们让核心线乘数和最大线乘数呢都是一,然后我们让左侧对列的长度呢是一,那也就是说我们如果有五个任务进来,一个呢会立即处理,一个呢会放在我们的队列中, 然后还有三个呢会通过我们的一个拒绝策略啊,然后去处理,那我这边自定了一个拒绝策略,我们看一下,那这个自定义的拒绝策略里面呢,其实主要就是打印了这样的一行日志, 那这个拒绝策略的一个效果呢?其实就相当于我们 gdk 自带的 discot policy, 也是丢弃任务,但是不抛出任何的异常。然后我们来看一下闷方法,我们这边有一个 y 处的循环,然后这边呢休眠了一秒钟,这边就模拟了一个定时 任务的一个处理,然后我们在这个循环里面呢开启了一部县城,然后我这边呢有五个任务,然后呢我们通过我们的县城时去处理这五个任务,然后并且呢他会返回一个未来的结果,我们把这个结果呢放到我们的一个飞车 list 里面, 然后我们在这边呢就不断的通过 get 方法去获得到我们的义补结果。那这个 demo 呢也比较简单,我们来分析一下他可能会出现的一个问题啊,把虚拟级参数呢初始化成实照,然后我们运行一下啊,我们这边有一个 future task, 他的一个实力数呢是不断飙升的, 那我们来分析一下,为什么 face task 这样的实力数会不断的飙升?我们可以看一下这个 subme 的方法,我们可以看到在这个方法里面呢,我们会把每一个 task 给它包装成一个 face task 的一个任务, 然后我们再通过 x q 特呢去执行我们这样的任务,并且呢我们还把非洲 task 进行返回,那为什么非洲 task 这样的实力数他在不断的飙升没有释放呢?原因呢就是我们的这样的一个 get 方法,我们可以看一下, 那在 facetask 这样的 get 方法中呢,他会有这样的一个判断,当 s 小于等于 completed, 也就是一的时候,会执行这样的一个方法,并且呢在这个方法里面呢进行等待,那其实我们的县城呢,就会在这样的一行代码呢进行阻塞, 那事实上我们在初始化 feels task 的时候呢,我们会把这样的一个标志位啊设置成零,我们可以看一下, 我们会把这样的一个 state 制成六六呢就是零,那它肯定是小于等于我们这样的一个 completing 的,对吧?所以我们的线 在执行这样的一个获得结果的时候呢,就会在这边阻塞,同时呢他还不会释放我们的非洲 task 啊,久而久之呢,就可能会出现 om 的一个情况, 大家在正常的情况下,我们的线程该如何不阻塞呢?其实就是看我们非洲 task 的一个乱方法,在这个方法里面呢,我们主要关注这个 set exception 方法和 set 方法, 那在这个 set exception 方法里呢,它会把我们的 t 给我们的 outcome, 那同时呢,它还会通过 oncefly 把我们这样的一个状态位的值呢给它修改掉, 或者呢通过这样的一个 set 方法把我们正常的返回值呢给我们的 outcome, 然后呢再通过 on safely 呢把我们 settlement 的这样的一个值呢制成 normal。 所以在任务正常执行的情况下呢,我们这样的一个 set 的值,它不可能是 completing, 那这个方法呢,就可以完美结束,就可以释放我们的 facetask。 那我们就得分析一下,为什么我们这样的一个状态值没有改变呢?其实呢,就是我们的 facetask 中那个 run 方法他没有执行,那为什么没有执行呢?那其实就是我们的一个拒绝策略。 我们来分析一下这段代码,这边有五个任务,一个呢被核心线陈述给执行,另一个呢进入到主色队列里面,还有三个呢被我们的拒绝策略执行。但是呢,在我们的拒绝策略里面啊,他什么都没做,只是打印了一个日志, 那就是因为我们的拒绝策略里面什么都没做啊,然后呢这边正常返回了我们的 future, 然后呢把我们的 future 放到飞车类似里面,在这边进行便利获得结果。所以调用这个 get 方法的时候呢,我们的状态其实就一直没办法改变,然后我们的飞车 他是个实力数呢就会越来越多。那既然我们分析到了原因啊,我们该如何去解决呢?那我们完全可以在拒绝策略里面呢泡一个异常,那泡异常之后,我们可以再来看一下这个代码 啊,这个代码里面我们把这个 facetask 去执行之后,我们通过我们的现成池,通过 thread pro xq 的执行的时候呢, 我们可以看一下这个 x q 的方法里面,那在这个方法里面呢,就会执行我们的 reject, 然后呢就会执行我们的拒绝策略,那在这边呢就会抛异常,那这边抛异常之后啊,这个方法就会抛异常, 抛一场呢,我们就会被我们的 cut 给捕捉到,而不会把这个任务放到我们的 future list 里面了。那当然我们在这边呢,也不要让他抑制阻塞,我们在这边可以 给他一个时间,然后给他一个兜底的方案。那如果说大家想要这样的一个 demo 以及之前的 demo 的话呢,可以到这来这,然后给他去发一个消息,像这样就可以拿到我们的 demo。 好,今天的一个分享呢,就到这。
本文将深入解读 java 中的现成池和 future task, 帮助开发者理解如何管理多现成任务执行,避免资源浪费,提升应用性能。我们将通过实力演示如何设计和优化现成池以及处理并发异常的最佳实践。一、引严 在 java 并发编程的世界里,县城池和 future task 是两个不可或缺的组件,他们不仅能够有效的管理和调度任务, 还能够提高代码的可读性和可维护性。本文只在为那些在并发编程中寻求效率和稳定性的开发者提供一份全面且实用的指南, 帮助你们更好的理解和利用这两个工具。二线城池的深度剖析一线城池基础概念首先,我们来 来了解县城池的基本原理。他是一个预先创建并管理一定数量县城的容器,可以重复使用这些县城执行任务,从而避免频繁的创建和销毁县城带来的开销。 我们还将探讨不同类型的现成池,如 fixed fret pool, cash fret pool, scheduled fret pool 等,以及他们各自的特点和适用场景。二、现成池配置与优化如何设置现成池大小? 如何调整工作队列策略?我们将在实践中讲解如何根据应用需求调整现成池参数,已达到最佳性能。此外,还会讨论如何避免现成池阻塞和饱和问题, 确保任务的顺利执行。三、 future task 的使用与理解一、 future task 介绍 future task 是主要把并发库提供的一个接口,他封装了一个 runnable 或者 callable 任务,并提供了检查任务状态和获取结果的功能,这在一部编程和结果依赖场景中尤为有用。 二、实力演示我们将通过具体的代码视力展示如何使用 future task 进行任务提交、取消和获取结果,以及如何处理可能的异常情况。四、并发编程实战与最佳实践 一、并发控制与同步了解核实,以及如何使用 synchronized 关键字以及 re, entry, block, sema, four 等高级同步机制, 以防止数据竞争和死锁。二、一步编程与回调设计,学习如何优雅的处理一步操作,避免回调地域, 提升代码的可读性和可维护性。三、错误处理与日志记录讨论并发编程中的常见错误, 如线城中断、超时等问题,以及如何通过适当的日志记录和异常处理机制进行跟踪和修复。五、结论与展望通过本文的学习, 你将对 drive 现成池和 future test 有更深入的理解,掌握在实际项目中高效利用他们的技巧。但记住,理论知识只是起点,真正的艺术在于实践。在你的代码之旅中不断探索和优化, 你会发现并发编程的无限魅力。希望这篇文章能为你的并发编程之路提供坚实的基础,让你的 java 应用在多线程的世界里游刃有余。
哇哈喽,大家好,我是瑞士老大哥,很多同学呢,被托付虐到怀疑人生,一度质疑备考托付的意义是什么? 备考托福和在美国大学读书到底有没有关系?今天我来给大家讲讲。大家在准备托福的时候,看到阅读部分的学术论文,听力部分的小讲座,考一部分的 fast, three top 以及写作部分的 sexxy, 学术写作,是不是脑子里曾经想过真实的美国大学生活? 喝这些太酸,你要吗?心里话就是想开车,我就是想开车,我从小就想开车, 他们不但一样,而且美国大学的学习对学术英语能力要求更高哦,这是重点。快,接下来我们在准备托福的时候呢,不要总想着去应付这个考试,而是要好好珍惜每一次的练习机会,未来到美国后, 可不要被繁重的学习压力压倒了哟。所以今天呢,瑞士老大哥就和大家分享一下,到底托福知识和技巧会被怎样应用到美国大学的学习中呢? 首先最重要的就是我们的阅读部分,其实美国大学的学习可以概括为三个字,听看说看,则是三项中又是最久的一项。 在美国大学的学习当中呢,一节课的课堂部分,也就是 like you, 可能只有一个小组教落呢三十分钟,但是老师布置的课后作业,课前的阅读任务可能长达四到五个小时,一般每次的阅读量呢,大概是六十到一百页文献或者是课本。 你不要过来呀,上这你可能就会问了,难道我们真的只能一个字一个字的看吗?那我还有什么休息时间呢?都在读书呀,瑞士老大哥告诉你,不用一个字一个字的看哦!其实呢,我们在美国学习的学 都会用拼 red 这个技巧,也就是快速浏览。为了保证在快速浏览的同时准确的把握核心内容,我们就需要用到阅读技巧了。那大家托付阅读当中呢?学习的技巧,比如说通过每段第一句话来概括文章大致内容, 送 xsuz 康师坤特雷 nice 后接关键内容,多次重复的词语必然是文章的重要关键词等,这些都可以应用在文章的阅读当中。 所以大家在平时练习托付阅读的时候呢,千万不要偷懒,为了刷题而刷题,完全忽略概括文章核心内容这个步骤。当然,这些经验都是可以应用在未来美国大学的学习当中。 这招从哪里学会来的?听力部分的技巧和阅读很像,都是要从大段的内容中淘金子。在美国大学的课堂里,每天最大的感受就是,哇,这个教授废话好多,能不能讲重点呀以及, 嗯,我是不是没有听到重点?比如转折后一般接重要内容,当教授用到 excet、 enchatesparch t 狗汪的不利听等词语时,一般接重要内容。这些技巧呢,请大家好好记忆并训练,这可是让你维持好成绩的必备技能。 这个技巧想必就不用多强调了,这就是托付口语 pass siri 和 top 的考察内容。这个能力呢,主要是用在你 未来的小组讨论或者是自我总结当中。美国大学的课当中,至少有四分之一的时间在进行小组讨论,所以快速总结闻到内容并复述的能力 非常的重要。美国课堂里强调 idares 和阴算词,太子的 siri 和太死的货仅仅是让你总结,而你需要做到的是基于课上内容发表自己的想法,并评价其他人的想法。当然在托福口语太死的 你不需要这么做,所以同学们好好训练自己的口述总结能力吧,争取让小组成员都佩服你。 这里告诉大家一个小小的技巧,既然前面说到了阅读听力需要概括内容,口语中呢,又需要做大量的复述,那么大家完全可以在做阅读听力之后,根据自己的笔记,把刚才 读到的内容和或者听到的内容用口语复述出来。这样做可以把口语训练与阅听刷题有机的联合起来,而且避免口语出现题荒的问题,毕竟一套 tpu 只有一个, suv 也只有一个 tspro, 不过真怕没有题,那可以私信瑞士小助手,把他逗开心了,自然会有真题福利哦。这个技巧的名称呢,听起来有那么一点点长,那么这个技巧到底是对应美国大学学习里的哪一种能力呢? 想必你也猜到了,没错,就是记笔记的能力,我是鬼。首先说到批判性思维这个词语,他指的就是用不同的角度和维度去看待一个问题。有的时候教授会在课堂上批判课本上的内容,发表自己不同的看法。那么这个时候呢?到底记录谁的观点, 记录教授的呢?还是记录课本上的呢?答案是都需要记,不仅如此,你还要记你自己的观点。 教授在批判文段内容的时候,并不是强迫你去接受他的观点,而是想训练你批判性思维的能力。这个时候, 如果你把书本的内容与教授的对应观点以及你自己的想法都记录下来,那么你会在笔记里形成一个完整的不如因素框架图,那对训练你的学术思维能力以及知识掌握有着非常好的功效哦!这么听起来,备考托 也不完全是应试考试吗?更重要的是为了进入大学之后更好的适应大学的学习和生活做准备,所以大家没有理由懈怠,只有正式和托付分手,才能正式牵手美好的大学生活。 好啦,今天的视频就到这里啦,那么你觉得托福考试里还有哪些能力很重要呢?欢迎留言与我们互动,我是圣老大哥,我们下期再见!
今天给大家来分享一道经典面试题, swred local 有哪些使用场景?我这里还有很多其他的面试题,大家想要的话可以在评论区扣六六六。我们现在讲第一种使用场景,慈悲事物。 我这里有一段代码,大家可以看一下,虽然代码其实很简单,会利用 gdp 是 temperature 的去执行两个收口。那么这里的问题是,当我们执行这两个收口的时候,它底层的数据会连接是由谁创建的呢? 这里的答案其实是 spring。 因为如果由 gdp 是 hambit 的,或者说 my benice 他们来负责创建数据库连接的话,数据库连接的 auto commit 属性它是等于 chew 的, 那这样子的话,他们在执行这些收口的时候,执行完就会立即提交掉。而当我整个方法执行的时候,如果抛了异常,那么想要回滚的就已经晚了。所以说对于 supreme 数据而言,就只能由 supreme 它自己去创建数据库连接,并且把 auto compat 的属性把它改成 force, 然后再来执行这里的设口啊。如果执行完之后发现出现了异常,那么 supreme 才会回滚掉。 那么这里就有一个问题, spring 创建的数据会连接 gdp 是 template 的,或者是 my belief, 他是怎么拿到的呢?而这就是通过 severed local 这个技术来拿到的。 spring 创建完数据库连接之后,会把它放到 spread logo 里面去,而 gdp 是 temperature 的,或者说 my benefits, 它们则会从 spread logo 里面去获取数据库连接,然后去执行售后。所以这是我们要讲的第一种使用 serend logo 的使用场景。
四分钟搞定 three 的 logo 的原理,就刚才跟大家讲解 three 的 logo 怎么实现呢?那么在之前我们是不是讲解了 three 的 logo 其实是一个线程本地变量,在多性程修改共享变量时,是修改的线程本地共享变量的副本,从而实现线程隔离的一个作用。那么 three 的 logo 是如何实现的呢? 那么呢我们先看一张图,那么这张图呢,就是 sweet local 的它的一个结构,首先呢在我们这个 sweet 类里面呢,就存在了一个 sweet local 脉搏对象, 那么 three 的 local map 里面呢,它存在了一个 n 群,那么这个 n 群呢是一个列表,它可以存在于多个 n 群对象,那么我们的 n 群里面呢,就存了一个 k 值和一个 y 路值,那么 k 值呢,就是我们这一个 three 的 local 对象本身, why not 值呢?就是我们需要缓存的这一个数据。关于这个问题的详细文字版,我已经整理了一份八十万字的专行面试大全笔记,放在视频的最后面,坚持看完一定对你有帮助。那么我们这个是 read local map, 它是什么作用呢?它其实呢是专门用来 存储当前县城共享变量的副本的,那么后续县城对共享变量他的一个修改呢,都是在我们这个 slideloc map 里面进行修改的,也就是针对这个副本来进行修改的,他呢是不会影响全局共享变量的值,那么他就从而实现了一个县城隔离。接下来呢我们就看一下他的一个具体实现。那么首先呢,我们就观察一下我们这个 slidelocal 的他的一个工作方法, 那么我们可以看到它的一个构造方法是不是为空的,那么并没有做一些其他的特殊的处理,所以呢接下来我们就观察一下它的一个 set 方法,看看它是怎样实现的。 那么 c 的方法里面呢,首先是获取了当前线程,那么获取了当前线程之后呢,就传入到了我们这一个 getatmap 方法里面,那么就得到了我们这一个所有的 localmap 的一个对象。接下来我们再看一下 getamap 他是怎样实现的? getatmap 里面呢?就直接返回了我们这一个所有的 locals, 我们看一下它是怎样实现的。那么 three 的 locals 呢?是不是就是我们刚刚讲到的是我们 three 的类里面的一个成员变量,也是我们这一个 three 的 local map, 也就是说我们的每一个县城,他是不是都有一个自身对应的省略的 local map, 那么我们再返回看一下,那么当我们拿到了省略的 local map 之后呢,我们就会进行一个判断,当他不为空的时候,就往我们这个 map 里面呢传一个值,那么首先他的 k 呢,就是我们当前的这一个省略的 local 外率值呢,就是我们需要缓存的值, 那么当我们卖不为空的时候呢,他会去创建我们这一个所谓的 logo 卖部,那么我们看一下他的一个实行逻辑,那么他其实呢就是直接实力化的一个我们所谓的 logo 卖部的对象,对不对? k y 路值呢?就是我们刚刚提到的一个所谓的 logo 对象,我们需要缓存的一个值, 那么这里就是这 sleep local 它的一个 set 方法实现。那么接下来呢,我们再看一下它的一个 get 方法,看看呢它是怎么获取值的,那么它的获取值呢,也是先获取到了我们当前县城,那么获取了县城之后就使用我们这一个 get map 方法,然后呢拿到我们当前县城里面的这一个 sleep local map 的对象,那么 拿到了之后呢进行了一个判断,他如果说是有数据的话呢,就在找到我们对应的这个 n 取对象,拿到了这个 n 取对象之后呢,我们就进行了一个返回,那么这也就是这里的 logo 的一个 get 方法实现, 那么我们看到这里是不是能知道,其实我们 sleep local 呢,它其实就是通过了在我们这一个县城里面呢使用到了一个成员变量,然后呢将我们需要缓存的数据呢根据一个 k y 六呢来存到我们这个 map 里面,它的 k 呢就是我们当前的这个 sleep local 对象,也就是说呢我们每一个县城呢都是有一个唯一的副本,对不对? 那么如果说我们有多个只需要维护的话呢,其实就是我们可以创建多个 sirid logo 出来,那么呢我们再回到我们这一个笔记里面,那么笔记里面其实呢我们也刚刚提到了我们这个 n 曲是不是可以存在于多个,那么呢我们在使用的时候呢,我们就只要磁力化多个 sirid logo 就可以了, 那么这也就是所谓的 logo 的一个实现逻辑,如果大家看完有些收获的话呢,可以点个赞,来个一键三连。
前两天项目上遇到一个问题,就是我需要从此县城复用副县城的 zara local 变量里的内容。我们都知道 zarad local 中填充的变量属于当前县城 改变量,对其他县城而言是隔离的,也就是说该变量是当前县城独有的变量,此县城无法直接复用复县城 thread local 变量里的内容, 这个时候就用到了 thread local 的籽类 inheritable thread local。 下面使用一个简单的例子演示一下, 这里创建了一个静态的 thread local 变量,提供 set 和 get 方法,在每方法中设置 thread local 的值,在声明一个固定大小的县城时,启动四个子县城去获取 thread local 的值。 另外作对比,在副县城也获取 thread local 的纸。启动一下,我们清楚的发现 此县城不能获取副县城 thread local 变量里的内容。下面我们把 thread local 修改成 inheritable thread local 试试, 其他不变。启动一下,发现此县城和副县城都能获取 inheritable thread local 的内容。下面简单从源码端看一下 thread local 和 inheritable thread local 的实现原理, 每个 thread local 对象都可以存储一个现成相关的变量副本,当调用 thread local 的 set 方法时, 实际上是将当前县城作为 key, 变量作为 value 存储到当前县城的 thread local map 中。当调用改方法时,则是根据当前县城作为 key, 在 thread local map 中查找对应的变量副本。 inheritable thread local 其实也是用 thread local map 去存放时, 这点和字 at local 一样,只不过 inheritable thread local 的变量在 thread 类里的名字叫 inheritable thread locals。 而在创建县城的时候 会有一个判断,如果 inheritable thread locals 不为 now, 就传递副县城的 inheritable thread locals 值,这样新创建出来的紫县城 inheritable thread locals 变量 就和副县城 inheritable thread locals 的内容一样了。 inheritable thread local 在某些情况下可能会传递失败,特别是在县城池或者使用县城池时,由于县城的副用,可能导致传递的值不符合预期。 这里可以通过使用阿里开源的 transmitable thread local 解决,大家可以去看一下。需要注意的是,和 thread local 一样, inheritable thread local 和 transmitable thread local 也需要小心内存泄露问题,及时调用 remove 方法,防止造成内存泄露。