Thread的方法join()使用

join()的作用:Waits for this thread to die.等待线程对象销毁。
在Thread源码中可以看到join源码是使用了wait()方法来实现等待功能。

因为join()内部使用了wait()方法实现,wait方法被调用后线程会释放锁,因此join方法也具有释放锁的特点。

这也是join()、wait()和sleep()的区别,sleep是不会释放锁的。

JDK1.8中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能够使线程排队运行。

/**
 * @author monkjavaer
 * @date 2018/12/15 16:36
 */
public class JoinThread implements Runnable{
    @Override
    public void run() {
        System.out.println("I am JoinThread run ...");
        try {
            TimeUnit.MILLISECONDS.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

 join()测试:

public class JoinTest {
    public static void main(String[] args) {
        try {
            Thread thread = new Thread(new JoinThread());
            thread.start();
            thread.join();
            System.out.println("....after JoinThread.....");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

  输出:

I am JoinThread run ...
....after JoinThread.....

 

posted @   monkjavaer  阅读(563)  评论(0)    收藏  举报
编辑推荐:
· 记一次 .NET某云HIS系统 CPU爆高分析
· 如果单表数据量大,只能考虑分库分表吗?
· 一文彻底搞懂 MCP:AI 大模型的标准化工具箱
· 电商平台中订单未支付过期如何实现自动关单?
· 用 .NET NativeAOT 构建完全 distroless 的静态链接应用
阅读排行:
· 干货分享!MCP 实现原理,小白也能看懂
· 精选 4 款免费且实用的数据库管理工具,程序员必备!
· Cursor:一个让程序员“失业”的AI代码搭子
· MCP开发应用,使用python部署sse模式
· 慢查询解决思路
点击右上角即可分享
微信分享提示