java多线程yield_Java多线程yield

Thread.yield( )方法:

使当前线程从执行状态(运行状态)变为可执行态(就绪状态)。cpu会从众多的可执行态里选择,也就是说,当前也就是刚刚的那个线程还是有可能会被再次执行到的,并不是说一定会执行其他线程而该线程在下一次中不会执行到了。

Java线程中有一个Thread.yield( )方法,很多人翻译成线程让步。顾名思义,就是说当一个线程使用了这个方法之后,它就会把自己CPU执行的时间让掉,让自己或者其它的线程运行。至于谁会再次得到CPU,就要看机器的了。

打个比方:现在有很多人在排队上厕所,好不容易轮到这个人上厕所了,突然这个人说:“我要和大家来个竞赛,看谁先抢到厕所!”,然后所有的人在同一起跑线冲向厕所,有可能是别人抢到了,也有可能他自己有抢到了。我们还知道线程有个优先级的问题,那么手里有优先权的这些人就一定能抢到厕所的位置吗? 不一定的,他们只是概率上大些,也有可能没特权的抢到了。下面的代码很能说明问题的。

sleep和yield的区别:

该方法与sleep()类似,只是不能由用户指定暂停多长时间,并且yield()方法只能让同优先级的线程有执行的机会。

1)Thread.sleep(long millis)必须带有一个时间参数。

sleep(long)使当前线程进入停滞状态,所以执行sleep()的线程在指定的时间内肯定不会被执行;

sleep(long)可使优先级低的线程得到执行的机会,当然也可以让同优先级的线程有执行的机会;

sleep(long)是不会释放锁标志的。

2)yield()没有参数

sleep 方法使当前运行中的线程睡眠一段时间,进入不可以运行状态,这段时间的长短是由程序设定的,yield方法使当前线程让出CPU占有权,但让出的时间是不可设定的。

yield()也不会释放锁标志。

实际上,yield()方法对应了如下操作;先检测当前是否有相同优先级的线程处于同可运行状态,如有,则把CPU的占有权交给次线程,否则继续运行原来的线程,所以yield()方法称为“退让”,它把运行机会让给了同等级的其他线程。

sleep 方法允许较低优先级的线程获得运行机会,但yield()方法执行时,当前线程仍处在可运行状态,所以不可能让出较低优先级的线程此时获取CPU占有权。在一个运行系统中,如果较高优先级的线程没有调用sleep方法,也没有受到I/O阻塞,那么较低优先级线程只能等待所有较高优先级的线程运行结束,方可有机会运行。

yield()只是使当前线程重新回到可执行状态,所有执行yield()的线程有可能在进入到可执行状态后马上又被执行,所以yield()方法只能使同优先级的线程有执行的机会。

例子:

package com.lee.thread;

public class YieldTest extends Thread {

public YieldTest(String name) {

super(name);

}

@Override

public void run() {

for (int i = 1; i <= 50; i++) {

// 当i为30时,该线程就会把CPU时间让掉,让其他或者自己的线程执行(也就是谁先抢到谁执行)

if (i == 30) {

System.out.println("============"+this.getName()+ "-----" + i);

this.yield();

}else{

System.out.println("" + this.getName() + "-----" + i);

}

}

}

public static void main(String[] args) {

YieldTest yt1 = new YieldTest("张三");

YieldTest yt2 = new YieldTest("李四");

yt1.start();

yt2.start();

}

}

结果1:李四(线程)当执行到30时会CPU时间让掉,这时张三(线程)抢到CPU时间并执行。

李四-----1

张三-----1

李四-----2

张三-----2

张三-----3

张三-----4

张三-----5

李四-----3

李四-----4

李四-----5

李四-----6

李四-----7

李四-----8

张三-----6

张三-----7

张三-----8

张三-----9

张三-----10

张三-----11

张三-----12

张三-----13

张三-----14

张三-----15

李四-----9

李四-----10

李四-----11

李四-----12

李四-----13

李四-----14

李四-----15

李四-----16

李四-----17

李四-----18

李四-----19

李四-----20

张三-----16

张三-----17

张三-----18

李四-----21

李四-----22

李四-----23

李四-----24

李四-----25

李四-----26

李四-----27

李四-----28

李四-----29

张三-----19

张三-----20

张三-----21

张三-----22

张三-----23

张三-----24

张三-----25

张三-----26

张三-----27

张三-----28

张三-----29

============张三-----30

张三-----31

张三-----32

张三-----33

张三-----34

张三-----35

张三-----36

============李四-----30

张三-----37

李四-----31

李四-----32

李四-----33

张三-----38

李四-----34

张三-----39

李四-----35

张三-----40

李四-----36

张三-----41

李四-----37

李四-----38

张三-----42

李四-----39

李四-----40

张三-----43

李四-----41

张三-----44

张三-----45

李四-----42

张三-----46

李四-----43

张三-----47

李四-----44

张三-----48

张三-----49

李四-----45

张三-----50

李四-----46

李四-----47

李四-----48

李四-----49

李四-----50

结果2:李四(线程)当执行到30时会CPU时间让掉,这时李四(线程)抢到CPU时间并执行。

张三-----1

张三-----2

张三-----3

张三-----4

张三-----5

张三-----6

张三-----7

张三-----8

张三-----9

张三-----10

张三-----11

张三-----12

张三-----13

张三-----14

张三-----15

张三-----16

张三-----17

张三-----18

张三-----19

张三-----20

张三-----21

张三-----22

张三-----23

张三-----24

张三-----25

张三-----26

张三-----27

张三-----28

张三-----29

============张三-----30

张三-----31

张三-----32

张三-----33

张三-----34

张三-----35

张三-----36

张三-----37

张三-----38

张三-----39

张三-----40

张三-----41

张三-----42

张三-----43

张三-----44

张三-----45

张三-----46

张三-----47

张三-----48

张三-----49

张三-----50

李四-----1

李四-----2

李四-----3

李四-----4

李四-----5

李四-----6

李四-----7

李四-----8

李四-----9

李四-----10

李四-----11

李四-----12

李四-----13

李四-----14

李四-----15

李四-----16

李四-----17

李四-----18

李四-----19

李四-----20

李四-----21

李四-----22

李四-----23

李四-----24

李四-----25

李四-----26

李四-----27

李四-----28

李四-----29

============李四-----30

李四-----31

李四-----32

李四-----33

李四-----34

李四-----35

李四-----36

李四-----37

李四-----38

李四-----39

李四-----40

李四-----41

李四-----42

李四-----43

李四-----44

李四-----45

李四-----46

李四-----47

李四-----48

李四-----49

李四-----50

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值