zoukankan      html  css  js  c++  java
  • Java线程中yield()和join()的用法以及注意事项

    本文目录

    一、yield的意思

    二、yield()的作用

    三、yield()的结论

    四、Java线程优先级

    五、yield()注意事项

     六、join()方法


    一、yield的意思

    yield的中文意思是放弃,投降的意思。当前线程调用yield的时候,是告诉虚拟机它愿意让其他的线程抢占自己的位置或者表明该线程没有紧急的事要做,但这只是一种暗示,并不能保证一定会发生。

    二、yield()的作用

    Thread.yield()方法的作用:暂停当前正在执行的线程,并执行其他同等优先级的线程。(可能没有效果哦)

    yield()让当前正在运行的线程回到可运行状态,以允许具有相同优先级的其他线程获得运行的机会。因此,使用yield()的目的是让具有相同优先级的线程之间能够适当的轮换执行。但是,实际中无法保证yield()达到让步的目的,因为,让步的线程可能被线程调度程序再次选中。

    三、yield()的结论

    public class TestYield {
      public static void main(String [] args){
        MyThread thread1 = new MyThread("thread1");
        MyThread thread2 = new MyThread("thread2");
        thread1.start();
        thread2.start();
      }
    }
    public class MyThread extends Thread{
      MyThread(String s){
          super(s);
      }
    
        @Override
      public void run(){
        for(int i = 0; i <= 100; i ++){
          System.out.println(getName() + ":" + i);
    
          if(("thread1").equals(getName())){
            if(i == 0){
              yield();
            }
          }
        }
      }
    }
    
     

    结论:大多数情况下,yield()将导致线程从运行状态转到可运行状态,但很有可能没有效果。

    四、Java线程优先级

    在java的多线程编程中,有可能会用到yield和join。在具体讲解yield和join之前,我们先来看看java中线程的优先级。

    线程的优先级:

    1、在没有指定线程的优先级的时候,线程都带有普通的优先级。

    2、线程的优先级可以分为1到10;10代表最高的优先级,1代表最低的优先级,普通优先级是5。

    3、优先级最高的线程在运行时给予优先,但不能保证线程启动后立刻就进入运行状态。

    4、与线程池中等待的线程相比,正在运行的线程拥有更高的优先级。

    5、由调度程序来决定执行哪一个线程。

    6、用setProperty()来设定用线程的优先级。

    7、在线程的start()方法调用之前,应该指定线程的优先级。

    五、yield()注意事项

    使用yield方法时要注意的几点内容:

    1、yield是一个静态的本地方法(native

    2、调用yield后,yield告诉当前线程把运行机会交给线程池中有相同优先级的线程。

    3、yield不能保证,当前线程迅速从运行状态切换到就绪状态。

    4、yield只能是将当前线程从运行状态转换到就绪状态,而不能是等待或者阻塞状态。

     六、join()方法

    线程实例中的join()方法可以被用来join到线程执行的开始或者其他线程执行的结束,所以直到其他线程运行结束这个线程才会执行。如果join()方法在线程实例中被调用,当前运行的线程会被堵塞,直到线程实例运行完成。

    例如线程a中调用线程b的join方法,这时线程a就会进入阻塞状态,直到线程b执行完成。这样就可以使并行的线程串行化的执行。

    具体的join()用法请参考:java join()基本用法与说明解释

  • 相关阅读:
    Web框架下安全漏洞的测试反思
    如何能低成本地快速获取大量目标用户,而不是与竞争对手持久战?
    Spring-Boot自定义Starter实践
    WM_QUERYENDSESSION与WM_ENDSESSION
    AutoMapper用法
    使用AutoMapper实现Dto和Model的自由转换(下)
    使用AutoMapper实现Dto和Model的自由转换(中)
    使用AutoMapper实现Dto和Model的自由转换(上)
    JSON中JObject和JArray的修改
    通信对象 System.ServiceModel.Channels.ServiceChannel 无法用于通信,因为其处于“出错”状态。
  • 原文地址:https://www.cnblogs.com/no8g/p/13415487.html
Copyright © 2011-2022 走看看