zoukankan      html  css  js  c++  java
  • Java多线程:start(),sleep(),yield(),join()

         Java多线程:start(),sleep(),yield(),join()由广州疯狂软件教育java培训分享:

      1.start()和run()

      执行的线程,一定要调用它的start()方法。不能调用run()方法。

      如果直接调用线程对象的run()方法,程序也会执行,但那样是在当前线程中执行,不会启动新的线程。

      start()方法的本质是从CPU中申请一个新的线程空间来执行 run()方法中的代码。

      run()方法的本质是只是线程的接口回调方法。

      一个线程对象只能运行成功一次start()方法,即已经调用start()方法的对象不能再次调用start()方法,否则会抛异常。

      2.sleep()

      sleep()是静态方法,使正在运行的线程进入阻塞状态。

      睡眠时间到了,会进入就绪状态。

      sleep()方法声明抛出了InterruptedException

      在sleep 时间间隔期满后,线程不一定立即恢复执行,即:

      Thread.sleep(1000)使得线程睡眠1秒,可能结果会大于1秒

      除非:

      a.醒来的线程具有更高的优先级。

      b.正在运行的线程因为其它原因而阻塞。

      所以:

      程序员只能最大限度的影响线程执行的次序,而不能做到精准控制。

      sleep()方法是静态方法,只对正在运行状态的线程对象有效。如:

      public class TestThread {

      public static void main(String[] args) throws InterruptedException {

      System.out.println(Thread.currentThread().getName());

      Thread threadNew=new Thread();

      threadNew.start();

      //这里是主线程sleep,而不是threadNew线程

      threadNew.sleep(1000);

      System.out.println(Thread.currentThread().getName());

      Thread.sleep(10);

      for(int i=0;i<100;i++){

      System.out.println("main"+i);

      }

      }

      }

      3.yield()

      yield()是静态方法,使正在运行的线程进入就绪状态。

      yield()方法声明没有抛出异常。

      yield()方法是让系统的线程调度器重新调度当前线程。

      可能:

      当某个线程调用yield()方法之后,线程调度器又将其调度出来重新进入到运行状态执行。

      通常不用yield()方法,而用sleep()方法。

      4.join()

      将几个并行线程的线程合并为一个单线程执行,

      应用场景是当一个线程必须等待另一个线程执行完毕才能执行时,

      它不是静态方法。

      它有3个重载的方法:

      void join()

      当前线程等该加入该线程后面,等待该线程终止。

      void join(long millis)

      当前线程等待该线程终止的时间最长为 millis 毫秒。 如果在millis时间内,该线程没有执行完,那么当前线程进入就绪状态,重新等待cpu调度

      void join(long millis,int nanos)

      等待该线程终止的时间最长为 millis 毫秒 + nanos 纳秒。如果在millis时间内,该线程没有执行完,那么当前线程进入就绪状态,重新等待cpu调度

      public class Test1 {

      public static void main(String[] args) throws InterruptedException {

      MyThread thread=new MyThread();

      thread.start();

      thread.join(1);//将主线程加入到子线程后面,不过如果子线程在1毫秒时间内没执行完,则主线程便不再等待它执行完,进入就绪状态,等待cpu调度

      for(int i=0;i<30;i++){

    System.out.println(Thread.currentThread().getName() + "线程第" + i + "次执行!");

      }

      }

      }

      class MyThread extends Thread {

      @Override

      public void run() {

      for (int i = 0; i < 1000; i++) {

      System.out.println(this.getName() + "线程第" + i + "次执行!");

      }

      }

      }

      在这个例子中,在主线程中调用thread.join(); 就是将主线程加入到thread子线程后面等待执行。不过有时间限制,为1毫秒。

      疯狂Java培训专注软件开发培训,提升学员就业能力,重点提升实践动手能力。技术知识沉淀深厚的老师,让你感受Java的魅力,激发你对于编程的热爱,让你在半年的时间内掌握8-10万的代码量,掌握Java核心技术,成为真正的技术高手;通过大量全真企业项目疯狂训练,迅速积累项目经验。让你成为技能型的现代化高端人才,迅速获得高薪就业!时间不等人,赶紧联系我们吧!疯狂java培训中心地址:广州天河区车陂沣宏大厦3楼。

  • 相关阅读:
    算法-对分查找(二分查找)C++实现
    Android Studio简单设置
    一起talk C栗子吧(第八回:C语言实例--素数)
    Maven生命周期
    java8_api_日期时间
    UITableviewcell的性能问题
    iOS开发25个性能调优技巧
    iOS9新特性
    iOS9 3DTouch、ShortcutItem、Peek And Pop技术一览
    iOS网络访问之使用AFNetworking
  • 原文地址:https://www.cnblogs.com/gojava/p/3656144.html
Copyright © 2011-2022 走看看