【Java基础】并发 - 多线程 - Thread.join(..)

本文详细解析了Java线程中的join()方法,包括其作用、参数及使用示例,帮助开发者理解如何利用join()方法实现线程间的等待与同步。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Thread.join(..)

join()的作用是等待该线程终止;也就是说,子线程调用join()方法后面的代码,只有等到子线程结束了才能执行。

利用join()方法可以将交替执行的线程合并成为顺序执行的线程,比如在线程B中调用了线程A的join()方法,则直到线程A执行完毕后,才会继续执行线程B。

void join()
Waits for this thread to die.
void join(long millis)
Waits at most  millis milliseconds for this thread to die.
void join(long millis, int nanos)
Waits at most  millis milliseconds plus  nanos nanoseconds for this thread to die.
如果线程被生成了,但还未被启动,调用它的join()方法是没有作用的,将直接继续向下执行


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实现的,当main线程调用t.join()的时候,main线程会获得线程对象t的锁(synchronized);调用该线程对象的wait()方法,直到该线程对象t唤醒main线程,比如线程对象t退出后。

主线程调用线程对象的join()方法时,必须能够拿到该线程对象的锁

示例 - join()

如下代码:

import java.lang.*;
import java.util.*;

public class JoinTest implements Runnable{
    public static int counter = 0;
	
	public void run(){
	    for (int i = 0; i < 10; i++){
		    counter++;
		}
	}
	
	public static void main(String args[]) throws Exception{
	    Runnable r = new JoinTest();
		Thread t = new Thread(r);
		t.start();
	
		System.out.println(counter);
	}
}

程序输出的结果通常都不是10. 

调用join()方法可以保证每次输出的结果都是10.

import java.lang.*;
import java.util.*;

public class JoinTest implements Runnable{
    public static int counter = 0;
	
	public void run(){
	    for (int i = 0; i < 10; i++){
		    counter++;
		}
	}
	
	public static void main(String args[]) throws Exception{
	    Runnable r = new JoinTest();
		Thread t = new Thread(r);
		t.start();
	
	    t.join();
		
		System.out.println(counter);
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值