• 我相信“交警雨中护送高考生”是真,“交警雨中护送高考生”反被该高考生家长投诉是假。 2019-04-16
  • 14名消防员日巡逻28公里 洗冷水澡 2019-04-10
  • 靶壕有了“蓝军”,百发百中的“神枪手”练起来 2019-04-10
  • 不是秀强大了,别人就会来做朋友,这逻辑不对 2019-04-01
  • 候选企业:中国石油呼和浩特石化公司 2019-03-26
  • 航天员沙漠野外生存训练完美收官!为第一天团打call 2019-03-25
  • 请问,建立市场经济后,原计划经济哪里去?改革后,我们还在实行计划经济,为何没有提及? 2019-03-25
  • 构建年轻干部梯次培养链 2019-03-19
  • 孙实的专栏作者中国国家地理网 2019-03-15
  • 湖南师范大学举行研究阐释党的十九大精神国家社科基金重大专项学术研讨会 2019-03-15
  • [雷人]蠢货!土地处于不同的城市和地段,关联的资源不一样,价值也不一样。不然给咱俩同样面积的土地,咱的在北上广深,你的在边远山区,你干么? 2019-03-08
  • 国际社会持续热议上合青岛峰会:上合组织发展进入新阶段 彰显中国领导力 2019-03-08
  • 珍惜野生动物频现甘孜境内 生态环境质量不断提升 2019-03-06
  • "新经济形势下金融创新的变革与机遇"论坛 2019-03-06
  • 频道栏目
    神奇公式秒杀全国11选5 > 程序开发 > 软件开发 > Java > 正文
    java线程方法之join简单总结(代码实例)
    2018-07-27 14:46:17         来源:hkr1363235285的博客  
    收藏   我要投稿

    山西十一选五走势图表:java线程方法之join简单总结(代码实例)

    神奇公式秒杀全国11选5 www.2zfa.com 虽然关于讨论线程join方法的博客已经很多了,不过个人感觉挺多都讨论得不够全面,所以我觉得有必要对其进行一个全面的总结。

      一、作用

      Thread类中的join方法的主要作用就是同步,它可以使得线程之间的并行执行变为串行执行。具体看代码:

    public class JoinTest {
     public static void main(String [] args) throws InterruptedException {
      ThreadJoinTest t1 = new ThreadJoinTest("小明");
      ThreadJoinTest t2 = new ThreadJoinTest("小东");
      t1.start();
      /**join的意思是使得放弃当前线程的执行,并返回对应的线程,例如下面代码的意思就是:
    程序在main线程中调用t1线程的join方法,则main线程放弃cpu控制权,并返回t1线程继续执行直到线程t1执行完毕
    所以结果是t1线程执行完后,才到主线程执行,相当于在main线程中同步t1线程,t1执行完了,main线程才有执行的机会
    */
      t1.join();
      t2.start();
     }
    
    }
    class ThreadJoinTest extends Thread{
     public ThreadJoinTest(String name){
      super(name);
     }
     @Override
     public void run(){
      for(int i=0;i<1000;i++){
    System.out.println(this.getName() + ":" + i);
      }
     }
    }

    上面程序结果是先打印完小明线程,在打印小东线程;  

    上面注释也大概说明了join方法的作用:在A线程中调用了B线程的join()方法时,表示只有当B线程执行完毕时,A线程才能继续执行。注意,这里调用的join方法是没有传参的,join方法其实也可以传递一个参数给它的,具体看下面的简单例子:

    public class JoinTest {
     public static void main(String [] args) throws InterruptedException {
      ThreadJoinTest t1 = new ThreadJoinTest("小明");
      ThreadJoinTest t2 = new ThreadJoinTest("小东");
      t1.start();
      /**join方法可以传递参数,join(10)表示main线程会等待t1线程10毫秒,10毫秒过去后,
    * main线程和t1线程之间执行顺序由串行执行变为普通的并行执行
    */
      t1.join(10);
      t2.start();
     }
    
    }
    class ThreadJoinTest extends Thread{
     public ThreadJoinTest(String name){
      super(name);
     }
     @Override
     public void run(){
      for(int i=0;i<1000;i++){
    System.out.println(this.getName() + ":" + i);
      }
     }
    }

    上面代码结果是:程序执行前面10毫秒内打印的都是小明线程,10毫秒后,小明和小东程序交替打印。

    所以,join方法中如果传入参数,则表示这样的意思:如果A线程中掉用B线程的join(10),则表示A线程会等待B线程执行10毫秒,10毫秒过后,A、B线程并行执行。需要注意的是,jdk规定,join(0)的意思不是A线程等待B线程0秒,而是A线程等待B线程无限时间,直到B线程执行完毕,即join(0)等价于join()。

      

      二、join与start调用顺序问题

      上面的讨论大概知道了join的作用了,那么,入股 join在start前调用,会出现什么后果呢?先看下面的测试结果

    public class JoinTest {
     public static void main(String [] args) throws InterruptedException {
      ThreadJoinTest t1 = new ThreadJoinTest("小明");
      ThreadJoinTest t2 = new ThreadJoinTest("小东");
      /**join方法可以在start方法前调用时,并不能起到同步的作用
    */
      t1.join();
      t1.start();
      //Thread.yield();
      t2.start();
     }
    
    }
    class ThreadJoinTest extends Thread{
     public ThreadJoinTest(String name){
      super(name);
     }
     @Override
     public void run(){
      for(int i=0;i<1000;i++){
    System.out.println(this.getName() + ":" + i);
      }
     }
    }

    上面代码执行结果是:小明和小东线程交替打印。

    所以得到以下结论:join方法必须在线程start方法调用之后调用才有意义。这个也很容易理解:如果一个线程都没有start,那它也就无法同步了。

      三、join方法实现原理

      有了上面的例子,我们大概知道join方法的作用了,那么,join方法实现的原理是什么呢?

      其实,join方法是通过调用线程的wait方法来达到同步的目的的。例如,A线程中调用了B线程的join方法,则相当于A线程调用了B线程的wait方法,在调用了B线程的wait方法后,A线程就会进入阻塞状态,具体看下面的源码

    public final synchronized void join(long millis)
     throws InterruptedException {
      long base = System.currentTimeMillis();
      long now = 0;
    
      if (millis < 0) {
    throw new IllegalArgumentException("timeout value is negative");
      }
    
      if (millis == 0) {
    while (isAlive()) {
     wait(0);
    }
      } else {
    while (isAlive()) {
     long delay = millis - now;
     if (delay <= 0) {
      break;
     }
     wait(delay);
     now = System.currentTimeMillis() - base;
    }
      }
     }

    从源码中可以看到:join方法的原理就是调用相应线程的wait方法进行等待操作的,例如A线程中调用了B线程的join方法,则相当于在A线程中调用了B线程的wait方法,当B线程执行完(或者到达等待时间),B线程会自动调用自身的notifyAll方法唤醒A线程,从而达到同步的目的。

    点击复制链接 与好友分享!回本站首页
    上一篇:java线程之间的通信方式实例讲解
    下一篇:设计模式学习之工厂模式实例解析
    相关文章
    图文推荐
    点击排行

    关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 神奇公式秒杀全国11选5

    版权所有: 神奇公式秒杀全国11选5--致力于做实用的IT技术学习网站

  • 我相信“交警雨中护送高考生”是真,“交警雨中护送高考生”反被该高考生家长投诉是假。 2019-04-16
  • 14名消防员日巡逻28公里 洗冷水澡 2019-04-10
  • 靶壕有了“蓝军”,百发百中的“神枪手”练起来 2019-04-10
  • 不是秀强大了,别人就会来做朋友,这逻辑不对 2019-04-01
  • 候选企业:中国石油呼和浩特石化公司 2019-03-26
  • 航天员沙漠野外生存训练完美收官!为第一天团打call 2019-03-25
  • 请问,建立市场经济后,原计划经济哪里去?改革后,我们还在实行计划经济,为何没有提及? 2019-03-25
  • 构建年轻干部梯次培养链 2019-03-19
  • 孙实的专栏作者中国国家地理网 2019-03-15
  • 湖南师范大学举行研究阐释党的十九大精神国家社科基金重大专项学术研讨会 2019-03-15
  • [雷人]蠢货!土地处于不同的城市和地段,关联的资源不一样,价值也不一样。不然给咱俩同样面积的土地,咱的在北上广深,你的在边远山区,你干么? 2019-03-08
  • 国际社会持续热议上合青岛峰会:上合组织发展进入新阶段 彰显中国领导力 2019-03-08
  • 珍惜野生动物频现甘孜境内 生态环境质量不断提升 2019-03-06
  • "新经济形势下金融创新的变革与机遇"论坛 2019-03-06