一、join线程的作用
join()方法:Thread提供的让一个线程去等待另一个线程完成。当在某个程序执行流中(如main线程)调用其它线程(如t2线程)的join方法(t2.join()),调用线程(main线程)将被阻塞,直到被join()方法加入的join线程(t2.start())执行完成为止。
二、示列代码分析
1、在没有join方法的时候
public class MyJoinTest implements Runnable {
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName() + "====" + i);
}
}
public static void main(String[] args) throws InterruptedException {
MyJoinTest myJoinTest = new MyJoinTest();
Thread t1 = new Thread(myJoinTest, "普通线程");
Thread t2 = new Thread(myJoinTest, "join的线程");
t1.start(); //启动t1线程
//下面属于main主线程
for (int i = 0; i < 10; i++) {
if (i == 5) {
t2.start(); //启动t2线程
}
System.out.println(Thread.currentThread().getName() + "====" + i);
}
}
}
输出结果为
main====0
main====1
main====2
main====3
main====4
普通线程====0
普通线程====1
普通线程====2
普通线程====3
普通线程====4
main====5
main====6
main====7
main====8
main====9
join的线程====0
join的线程====1
join的线程====2
join的线程====3
join的线程====4
2、在有join方法的时候
public class MyJoinTest implements Runnable {
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName() + "====" + i);
}
}
public static void main(String[] args) throws InterruptedException {
MyJoinTest myJoinTest = new MyJoinTest();
Thread t1 = new Thread(myJoinTest, "普通线程");
Thread t2 = new Thread(myJoinTest, "join的线程");
t1.start(); //启动t1线程
//下面属于main主线程
for (int i = 0; i < 10; i++) {
if (i == 5) {
t2.start(); //启动t2线程
//main线程调用了t2线程的join方法,导致main线程必须等待t2执行结束才可以向下执行
t2.join();
}
System.out.println(Thread.currentThread().getName() + "====" + i);
}
}
}
输出结果为
main====0
main====1
main====2
main====3
main====4
普通线程====0
普通线程====1
普通线程====2
普通线程====3
普通线程====4
join的线程====0
join的线程====1
join的线程====2
join的线程====3
join的线程====4
main====5
main====6
main====7
main====8
main====9
3、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");
}
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线程,从而达到同步的目的。
网友评论