• yield(),sleep(),join()


    1、sleep()方法会给其他线程运行的机会,而不考虑其他线程的优先级,因此会给较低线程一个运行的机会;yield()方法只会给相同优先级或者更高优先级的线程一个运行的机会。

    2、当线程执行了sleep(long millis)方法后,将转到阻塞状态,参数millis指定睡眠时间;当线程执行了yield()方法后,将转到就绪状态。

    3、sleep()方法声明抛出InterruptedException异常,而yield()方法没有声明抛出任何异常

    4、sleep()方法比yield()方法具有更好的移植性

    5.Thread.sleep(long millis),必须带有一个时间参数,yield()没有参数

         sleep 方法使当前运行中的线程睡眼一段时间,进入不可运行状态,这段时间的长短是由程序设定的,yield 方法使当前线程让出CPU占有权,但让出的时间是不可设定的。yield()也不会释放锁标志。

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

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

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

    如果希望明确地让一个线程给另外一个线程运行的机会,可以采取以下的办法之一:

      1、调整各个线程的优先级

      2、让处于运行状态的线程调用Thread.sleep()方法

      3、让处于运行状态的线程调用Thread.yield()方法

      4、让处于运行状态的线程调用另一个线程的join()方法

    Thread.Sleep(0)的作用,就是“触发操作系统立刻重新进行一次CPU竞争”,此时操作系统就会重新计算大家的总优先级——注意这个时候是连当前线程一起计算的。

    join() method suspends the execution of the calling thread until the object called finishes its execution.

    也就是说,t.join()方法阻塞调用此方法的线程(calling thread),直到线程t完成,此线程再继续;通常用于在main()主线程内,等待其它线程完成再结束main()主线程。例如:

     1 import java.util.Date;
     2 import java.lang.String;
     3 public class JoinTest01{
     4         static class MyThread implements Runnable {
     5             private String name;
     6 
     7             public MyThread(String name) {
     8                 this.name = name;
     9             }
    10 
    11             public void run() {
    12                 System.out.printf("%s begins:%s
    ", name, new Date());
    13                 try {
    14                     Thread.sleep(4);
    15                 } catch (InterruptedException e) {
    16                     e.printStackTrace();
    17                 }
    18                 /*当try语句中出现异常是时,会执行catch中的语句,java运行时系统会自动将catch括号中的Exception e 初始化,
    19                 也就是实例化Exception类型的对象。e是此对象引用名称。然后e(引用)会自动调用Exception类中指定的方法,
    20                 也就出现了e.printStackTrace(),printStackTrace();则表示打印异常堆栈信息,一般是打印到控制台,方便问题的定位和分析
    21                  */
    22                 System.out.printf("%s has finished:%s
    ", name, new Date());
    23             }
    24         }
    25    public static void main(String[] args){
    26         Thread t1 = new Thread(new MyThread("One"));
    27         Thread t2 = new Thread(new MyThread("Two"));
    28         t1.start();
    29         t2.start();
    30         try {
    31             t1.join();//main线程调用了此方法,要等t1结束,main线程才能继续
    32             t2.join();
    33         }
    34         catch (InterruptedException e){
    35             e.printStackTrace();
    36         }
    37         System.out.println("main thread is finished.");
    38     }
    39 }
  • 相关阅读:
    maven学习(四)maven的生命周期
    maven学习(六)依赖、聚合、继承
    Koa2学习(三)GET请求
    Koa2学习(二)async/await
    Koa2学习(一)环境搭建
    实现一个简易的express中间件
    js生成页面水印
    使用 dva + antd 快速开发react应用
    使用ab 进行并发压力测试
    python3 使用http.server模块 搭建一个简易的http服务器
  • 原文地址:https://www.cnblogs.com/echo-cheng/p/6818862.html
Copyright © 2020-2023  润新知