java的join_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方法的理解与说明的文章就介绍到这了,更多相关java中join方法内容请搜索聚米学院以前的文章或继续浏览下面的相关文章希望大家以后多多支持聚米学院!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值