多线程之sleep,join,yield


highlight: androidstudio

先来张线程状态图热热身

image.png

join

  • 可以保证线程的执行顺序

  • 现在有两个线程如下: ```java private static void testJoin() { Thread t1 = new Thread(() -> { for (int i = 0; i < 10; i++) { System.out.println("A" + i); try { Thread.sleep(50); } catch (InterruptedException e) { e.printStackTrace(); } } }); t1.start(); new Thread(() -> {

    for (int i = 0; i < 10; i++) { System.out.println("B" + i); try { Thread.sleep(50); } catch (InterruptedException e) { e.printStackTrace(); } } }).start(); } ```

运行方法看下输出:

java A0 B0 A1 B1 A2 B2 A3 B3 B4 A4 B5 A5 B6 A6 B7 A7 B8 A8 A9 B9

  • 当在线程A中调用线程B.join()时候 (线程A将会让出cpu,给线程B)如下

```java private static void testJoin() throws InterruptedException { Thread t1 = new Thread(() -> { for (int i = 0; i < 10; i++) { System.out.println("A" + i); try { Thread.sleep(50); } catch (InterruptedException e) { e.printStackTrace(); } } }); t1.start(); new Thread(() -> { try { //在本线程内,等待t1线程执行完毕再执行本线程,如果在main线程中t1.join,那就是main线程让出cpu,给t1执行 t1.join(); } catch (InterruptedException e) { e.printStackTrace(); }

for (int i = 0; i < 10; i++) {
     System.out.println("B" + i);
     try {
        Thread.sleep(50);
     } catch (InterruptedException e) {
        e.printStackTrace();
     }
  }

}).start(); } ```

java A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 B0 B1 B2 B3 B4 B5 B6 B7 B8 B9

sleep用的比较多

  • 尤其是查询接口sleep一下 (为后续优化埋下伏笔) ,老板估计会给你加钱哈,当然搞不好也会last day 哈哈~~~
  • 注意sleep是拿这锁去sleep,其他线程会阻塞哦 代码不贴了没啥说的

yield

  • 就是当前线程正在执行的时候停止下来进入等待队列(就绪状态,CPU依然有可能把这个线程拿出来运行), 当然,更大的可能性是把原来等待的那些拿出一个来执行,所以yield的意思是我让出一下CPU,后面你们能不能抢 到那我不管 so 给他起个名词叫做 礼让 出于礼貌让一下,后续我可能还会和你抢!!!

```java static void testYield() { new Thread(() -> { for (int i = 0; i < 10; i++) { System.out.println("A" + i); Thread.yield();

}

}).start();

new Thread(() -> { for (int i = 0; i < 10; i++) { System.out.println("------------B" + i); } }).start(); } ```

不礼让

image.png

礼让

image.png

当然该测试存在一定的歧义(因为数据很少)。不过当数据量大实话,我相信礼让的效果会更明显也更有说服力。(也就是说B抢到的cpu次数会更多些)

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值