成都创新互联网站制作重庆分公司

java线程join方法的使用方法

本篇内容介绍了“java线程join方法的使用方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

创新互联服务项目包括襄城网站建设、襄城网站制作、襄城网页制作以及襄城网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,襄城网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到襄城省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!

如下所示代码,是并行执行的

public class ThreadTest {  //private static final Long count = 10000L;  public static void main(String[] args){    long base = System.currentTimeMillis();    try {      ThreadJoin t1 = new ThreadJoin("线程1");      ThreadJoin t2 = new ThreadJoin("线程2");      //t1.join();      t1.start();      t1.join();      t2.start();    } catch (Exception e) {      e.printStackTrace();    }    long time = System.currentTimeMillis() - base;    System.out.println("执行时间:"+time);  }  }class ThreadJoin extends Thread{  private static final Long count = 10L;  public ThreadJoin(String name){    super(name);  }  @Override  public void run() {    //super.run();    for(int i = 1; i <= count; i ++){      System.out.println(this.getName()+":"+i);    }  }}

打印出来的信息,都是这样的

执行时间:0线程1:1线程2:1线程2:2线程2:3线程2:4线程2:5线程2:6线程2:7线程2:8线程2:9线程2:10线程1:2线程1:3线程1:4线程1:5线程1:6线程1:7线程1:8线程1:9线程1:10

要实现串行执行,可以加上join方法,实现线程1执行完成后才开始执行线程2,也就是串行执行

public class ThreadTest {  //private static final Long count = 10000L;  public static void main(String[] args){    long base = System.currentTimeMillis();    try {      ThreadJoin t1 = new ThreadJoin("线程1");      ThreadJoin t2 = new ThreadJoin("线程2");      //t1.join();      t1.start();      t1.join();      t2.start();    } catch (Exception e) {      e.printStackTrace();    }    long time = System.currentTimeMillis() - base;    System.out.println("执行时间:"+time);  }  }class ThreadJoin extends Thread{  private static final Long count = 10L;  public ThreadJoin(String name){    super(name);  }  @Override  public void run() {    //super.run();    for(int i = 1; i <= count; i ++){      System.out.println(this.getName()+":"+i);    }  }}

线程1:1线程1:2线程1:3线程1:4线程1:5线程1:6线程1:7线程1:8线程1:9线程1:10执行时间:0线程2:1线程2:2线程2:3线程2:4线程2:5线程2:6线程2:7线程2:8线程2:9线程2:10

从执行结果看,已经是串行执行线程

所以上面的例子是调了现场1的join方法,也就是说要先执行完成线程1,然后才执行main主线程

join方法的作用是,举个例子,在A线程里调B线程的join方法时,要先B线程执行完成,然后才会继续执行A线程

ok,上面调join方法是不加参数的,也可以加上参数,比如线程A.join(10);,就是说线程A执行10s后,继续执行B线程

注意:join时间参数缺省的情况,默认是0,也就是说join()等同于join(0);

/**   * Waits for this thread to die.   *   *

An invocation of this method behaves in exactly the same   * way as the invocation   *   *

  * {@linkplain #join(long) join}{@code (0)}   *
  *   * @throws InterruptedException   *     if any thread has interrupted the current thread. The   *     interrupted status of the current thread is   *     cleared when this exception is thrown.   */  public final void join() throws InterruptedException {    join(0);  }

Thread类里的源码,可以看出默认赋值为0,然后这个0是什么意思?0不是表示执行0s,而是表示要A线程执行完成才继续执行B线程的意思

ok,然后为什么调用了join方法就可以实现线程同步?我们简单看一下代码:

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");    } //执行时间为0或者缺省情况    if (millis == 0) {      while (isAlive()) {//表示线程还没执行好        wait(0);//调用线程的wait方法      }    } else {//执行时间大于0的情况      while (isAlive()) {        long delay = millis - now;//循环计算延期时间        if (delay <= 0) {          break;        }        wait(delay);//同样调用线程的wait方法        now = System.currentTimeMillis() - base;      }    }  }

ok,看了一下源码,还是比较容易理解的,其实就是调用了现场wait方法实现线程同步的

“java线程join方法的使用方法”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注创新互联网站,小编将为大家输出更多高质量的实用文章!


文章名称:java线程join方法的使用方法
链接URL:http://cxhlcq.com/article/pdpieg.html

其他资讯

在线咨询

微信咨询

电话咨询

028-86922220(工作日)

18980820575(7×24)

提交需求

返回顶部