kim.zhang

风在前,无惧!


  • 首页

  • 标签42

  • 分类12

  • 归档94

  • 搜索

yield方法.md

发表于 2020-08-10 更新于 2021-11-21 分类于 并发
本文字数: 1.7k 阅读时长 ≈ 2 分钟

yield方法的使用

  • Thread类中的静态native方法
  • 让出剩余的时间片,本身进入就绪状态,不释放锁
  • cpu调度还可能调度到本线程
  • sleep是在一段时间内进入阻塞状态,cpu不会调度它。而yield是让出执行权,本身还处于就绪状态,cpu还可能立即调度它

yield方法的定义

1
public static native void yield();

栗子1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class YieldDemo02 extends Thread {
public static Object lock = new Object();

@Override
public void run() {
synchronized (lock) {
System.out.println(this.getName() + " yield");
// 打开关闭此注释查看输出效果,对比差异
this.yield();
System.out.println(this.getName() + " run over");
}
}

public static void main(String[] args) {
for (int i = 0; i < 1000; i++) {
YieldDemo02 demo = new YieldDemo02();
demo.start();
}
}
}

执行结果:

yield是有建议权的,一旦cpu采取了它的建议,就会让出时间片。

但是执行结果却是“间接”的,无论线程的数量有多少,执行结果都是间接有序的,这是为什么呢?

因为有synchronized关键字,synchronized保证原子性。而另一方面,也说明了yield()方法只是让出剩余的时间片,但是不释放锁。

1
2
3
4
Thread-0 yield
Thread-0 run over
Thread-4 yield
Thread-4 run over

await与yield的对比

  • wait也是让出执行权,它与yield的区别是,wait会释放锁
  • wait需要配合使用synchronized关键字和notifyAll()使用
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
public class YieldDemo02 extends Thread {
public static Object lock = new Object();

@Override
public void run() {
synchronized (lock) {
System.out.println(this.getName() + " yield");

//使用wait方法来做对比,查看释放锁与不释放锁的区别
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}

System.out.println(this.getName() + " run over");
}
}

public static void main(String[] args) {
for (int i = 0; i < 1000; i++) {
YieldDemo02 demo = new YieldDemo02();
demo.start();
}

// 配合wait使用看效果
synchronized (lock) {
lock.notifyAll();
}
}
}

执行结果:

输出结果是先输出yield,再输出run over。且先输出yield的后输出run over。

可以看出,虽然在synchronized代码块内,但是wait方法是释放锁的。

1
2
3
4
Thread-0 yield
Thread-1 yield
Thread-1 run over
Thread-0 run over

总结:

  • yield方法最好不要使用,JDK也不推荐使用,但是保留这个方法的目的是在一些包中会有使用到,我们自己尽量不要去使用
一毛也是爱~
Kim.Zhang 微信支付

微信支付

# 并发基础
进程与线程.md
线程安全.md
  • 文章目录
  • 站点概览
Kim.Zhang

Kim.Zhang

且行且珍惜
94 日志
12 分类
42 标签
E-Mail Weibo
  1. 1. yield方法的使用
  2. 2. yield方法的定义
  3. 3. 栗子1
  4. 4. await与yield的对比
粵ICP备19091267号 © 2019 – 2022 Kim.Zhang | 629k | 9:32
本站总访问量 4 次 | 有 309 人看我的博客啦 |
博客全站共176.7k字
载入天数...载入时分秒...
0%