温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

java中join方法的作用是什么

发布时间:2021-01-11 15:17:08 来源:亿速云 阅读:256 作者:Leah 栏目:开发技术

java中join方法的作用是什么?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

前言:

java 中的 join() 方法在多线程中会涉及到,这个方法最初理解起来可能有点抽象,用一两次大概就懂了。简单说就是当前线程等待调用join方法的线程结束才能继续往下执行。

1. 举个例子

如下,

MyRunnable 类是实现 Runnable 接口的多线程类,其run() 方法是一个计算,计算值存储在 result 字段,获取计算结果就必须等线程执行完之后调用 getResult() 获取

public class MyRunnable implements Runnable {
 private int num;
 private String threadName;
 private long result;
 
 public MyRunnable(int num, String threadName) {
  this.threadName = threadName;
  this.num = num;
 }
 
 public void run() {
  for (int i = 0; i < num; i++) {
   result += i;
  }
 }
 
 
 public long getResult() {
  return result;
 }
}
 public class NormalTest {
 public static void main(String[] args) {
 
  normal();
 
 }
 
 private static void normal() {
  MyRunnable myRunnable_1 = new MyRunnable(1000, "runnable_1");
 
  Thread thread_1 = new Thread(myRunnable_1);
  thread_1.start();
 
  do {
   System.out.println("--------------------------------------------------");
   System.out.println("thread status: " + thread_1.isAlive() + ",result: " + myRunnable_1.getResult());
  } while (thread_1.isAlive());
 }
}

获取计算结果需要持续判断线程 thread_1 是否结束才能最终获取,输出如下:

--------------------------------------------------
thread status:  true,result: 0
--------------------------------------------------
thread status:  true,result: 11026
--------------------------------------------------
thread status:  false,result: 499500

而使用join()方法可以省去判断的麻烦,如下

 public class JoinTest {
 public static void main(String[] args) {
 
  join();
 
 }
 
 
 private static void join() {
 
  MyRunnable myRunnable_1 = new MyRunnable(1000, "runnable_1");
 
  Thread thread_1 = new Thread(myRunnable_1);
  thread_1.start();
 
  try {
   thread_1.join();
  } catch (InterruptedException e) {
   e.printStackTrace();
  }
 
  System.out.println("thread status: " + thread_1.isAlive() + ",result: " + myRunnable_1.getResult());
 
 }
}

输出如下:

thread status:  false,result: 499500

调用join方法以后当前线程(在这里就是main函数)会等待thread_1 结束后才继续执行下面的代码。

2. jion() 方法源码解析

其实 join() 方法内部的实现跟上面例子中的normal()方法很类似,也是使用线程的 isAlive() 方法来判断线程是否结束,核心源码如下:

 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) {    // join 方法如果不传参数会默认millis 为 0
   while (isAlive()) {
    wait(0);
   }
  } else {
   while (isAlive()) {
    long delay = millis - now;
    if (delay <= 0) {
     break;
    }
    wait(delay);
    now = System.currentTimeMillis() - base;
   }
  }
 }

当然上述还涉及 Object 类的 wait() 方法,感兴趣可以查一下,这里可以简单的理解就是一个等待多少时间。

关于java中join方法的作用是什么问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注亿速云行业资讯频道了解更多相关知识。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI