Java多线程学习笔记 - 六、使用Thread.join()方法

本文详细介绍了Java中线程同步的方法join(),包括其作用、用法以及带超时参数的版本。通过示例代码展示了join()如何使调用线程等待目标线程结束,以及如何处理超时情况。了解join()有助于更好地控制和协调多线程程序的执行流程。

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

一、概述

        与 wait()notify() 方法一样,join()是另一种线程间同步机制。

        当调用join()方法时,调用线程进入等待状态。它一直处于等待状态,直到被调用的线程终止。

二、Thread.join()方法

        参考代码

class SampleThread extends Thread {
    public int processingCount = 0;

    public SampleThread(int processingCount) {
        this.processingCount = processingCount;
        LOGGER.info("Thread Created");
    }

    @Override
    public void run() {
        LOGGER.info("Thread " + this.getName() + " started");
        while (processingCount > 0) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                LOGGER.info("Thread " + this.getName() + " interrupted");
            }
            processingCount--;
        }
        LOGGER.info("Thread " + this.getName() + " exiting");
    }
}

@Test
void test_join()
{
	Thread t2 = new SampleThread(1);
	t2.start();
	System.out.println("Invoking join");
	try {
		t2.join();
	} catch (InterruptedException e) {
		e.printStackTrace();
	}
	System.out.println("Returned from join");
	System.out.println(t2.isAlive());
}

        输出如下

Thread Created
Invoking join
Thread Thread-2 started
Thread Thread-2 exiting
Returned from join
false

        如果引用的线程被中断,join()方法也可能返回。在这种情况下,该方法抛出一个 InterruptedException。

        最后,如果引用的线程已经终止或尚未启动,则调用join()方法会立即返回。

三、带超时的Thread.join()方法

        如果引用的线程被阻塞或处理时间过长,join() 方法将继续等待。因为调用线程将变得无响应。 为了处理这些情况,我们使用允许我们指定超时时间的 join() 方法的重载版本。

        有两个重载 join() 方法的定时版本:

public final void join(long millis) throws InterruptedException
public final void join(long millis,int nanos) throws InterruptedException

        测试代码

@Test
public void waitsUntilTimedout()
  throws InterruptedException {
    Thread t3 = new SampleThread(10);
    t3.start();
    t3.join(1000);
    assertTrue(t3.isAlive());
}

        在这种情况下,调用线程等待大约 1 秒以等待线程 t3 完成。如果线程 t3 在此时间段内未完成,则join()方法将控制权返回给调用方法。

        Timed join()取决于操作系统的计时。不一定等于我们等待指定的时间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

坐望云起

如果觉得有用,请不吝打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值