多线程之sleep,join,yield

161 阅读1分钟

先来张线程状态图热热身

image.png

join

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

  • 现在有两个线程如下:

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();
}

运行方法看下输出:

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)如下
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();
}
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 给他起个名词叫做 礼让 出于礼貌让一下,后续我可能还会和你抢!!!
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次数会更多些)