让线程放弃执行权
导言
如何让正在执行任务的线程放弃执行权,我们可以使用 thread类里面的yield的方法,该方法是一个静态方法,直接使用thread类名调用,它的作用是使当前线程放弃执行权。
演示
下面来演示该方法,演示该方法需要用到两个任务,分别是赋值任务和打印任务。
赋值、任务的内容是定一个value属性,然后给value赋值,打印任务的内容是当value被赋值以后,打印value的值。
我们先来编写右边的赋值任务,定义一个静态属性value,初始值为0。
为了让放弃执行权效果更加明显,在给value赋值之前,我们让线程休眠三秒钟,最后我们给value赋值100,至此赋值任务编写完成。
再来看看左边的打印任务,在打印任务中直接输出value的值,不过这样还没等到给value赋值,就直接输出了value的值。所以我们需要在value被赋值以前放弃执行权,使用while循环,判断value的值是否等于0。当y轴的值等于0时,直接使用thread类名调用yield的方法。 使当前现场放弃执行权,至此打印任务也编写完成。
接下来分别执行这两个任务,首先将任务创建出来,然后创建两个线程,分别将这两个任务传递给两个线程,最后启动这两个线程。
从运行结果来看,三秒之后value的值被打印了出来,符合预期。
不过打印任务中有一段代码存在争议,就是这段while代码能不能被以下两种情况替代?
第一种情况,循环题里面什么都不写,空转。
第二种情况,循环题里面写上continue。
其实这两种情况是一个意思,所以我们就拿第二种情况和源代码进行对比,我们来看看他们究竟有什么不同。首先我们来看左边的情况,print的线程也就是打印任务的线程,他一直拿着执行权在那里空转,我们的右边的value线程他一直拿不到执行权,所以呢他就无法给value赋值,value的值一直为0,打印任务它里面的循环条件一直成立,while循环一直在那里空转。
再来看看右边的情况,打印任务的线程拿到了执行权,
但是 value的值一直为0。所以即使他拿到了知情权,也会放弃该知情权。此时赋值任务的线程就会拿到执行权,他就会给value赋值,判断value是否等于0的时候,那么结果就会为false。那么此时呢我们的程序就顺利的执行完毕了。以上就是两段代码的区别。
总结
最后我们来总结一下本节的内容,本节介绍了thread类里面的yield的方法,它是一个静态方法,可以直接通过thread的类名调用。
作用是使当前线程放弃执行权,在实际开发中偶尔会用到它。
附录:
笔记完整文本:
如何让正在执行任务的线程放弃执行权,我们可以使用 three的链里面的yellow的方法,该方法是一个静态方法,直接使用是raise类名调用,它的作用是使当前县城放弃执行权。下面来演示该方法,也是该方法需要用到两个任务,分别是赋值、任务和打印任务。赋值、任务的内容是定一个value属性,然后给value赋值打印任务的内容是当然will you被复制以后,打印万六的值,我们先来编写右边的赋值任务,定义一个静态属性value,初始值为0。 为了让放弃执行权效果更加明显,在给wedding复制之前,我们让线程休眠三秒钟,最后我们给value赋值100,至此赋值任务编写完成。再来看看左边的打印任务,在打印任务中直接输出wag的值,不过这样还没等到给y零赋值,就直接输出了外力的值。所以我们却要在value被副职以前放弃执行权,使用VR循环,判断y轴的值是否等于0。当y轴的值等于0时,直接使用thread类名调用yellow的方法。 十当前现场放弃执行权,至此打印任务也编写完成。接下来分别执行这两个任务,首先将任务创建出来,然后创建两个线程,分别将这两个任务传递给两个线程,最后启动这两个线程。从运行结果来看,三秒之后value的值被打印了出来,符合预期。不过打印任务中有一段代码存在争议,就是这段where代码能不能被以下两种情况替代?第一种情况,循环题里面什么都不写,空转。 第二种情况,循环题里面写上continue。其实这两种情况是一个意思,所以我们就拿第二种情况和源代码进行对比,我们来看看他们究竟有什么不同。首先我们来看左边的情况,普润的县城也就是打印任务的线程,他一直拿着执行权在那里空转,我们的右边的value线程他一直拿不到执行权,所以呢他就无法给value赋值,外料的值一直为0,打印任务它里面的循环条件一直成立,VR循环一直在那里空转。 再来看看右边的情况,打印任务的线程拿到了执行权,但是 y6的值一直为0。所以即使他拿到了知情权,也会放弃该吃侵权。此时副职任务的线程就会拿到执行权,他就会给value赋值,判断y六是否等于0的时候,那么结果就会为false。那么此时呢我们的程序就顺利的执行完毕了。以上就是两弹代码的区别。最后我们来总结一下本节的内容,本节介绍了thread类里面的yellow的方法,它是一个静态方法,可以直接通过three的类名调用。 作用是十当前线程放弃执行权,在实际开发中偶尔会用到它。