java join 源码_java并发:join源码分析

join

join

join是Thread方法,它的作用是A线程中子线程B在运行之后调用了B.join(),A线程会阻塞直至B线程执行结束

join源码(只有继承Thread类才能使用)

基于openjdk1.8的源码

public final void join() throws InterruptedException {

join(0);

}

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;

}

}

}

/**

* Tests if this thread is alive. A thread is alive if it has

* been started and has not yet died.

*

* @return true if this thread is alive;

* false otherwise.

*/

public final native boolean isAlive();

/*

* Note that the {@code wait} method, as it places the current thread

* into the wait set for this object, unlocks only this object; any

* other objects on which the current thread may be synchronized remain

* locked while the thread waits.

*

...

*/

public final native void wait(long timeout) throws InterruptedException;

源码分析

A线程调用了B.join(),获取了B的锁,当B alive,B.wait(0)会让当前线程A阻塞,执行join方法等同于,A线程进入了下列

的语句

syncronized(B){

...

B.wait

...

}

代码测试

package com.java.javabase.thread.base;

import lombok.extern.slf4j.Slf4j;

@Slf4j

public class JoinTest {

public static void main(String[] args) {

Thread t1 =new ThreadOne("t1");

t1.start();

log.info("current thread is : {} run",Thread.currentThread().getName());

try {

t1.join();

} catch (InterruptedException e) {

log.info("InterruptedException",e);

e.printStackTrace();

}

log.info("current thread is : {} end",Thread.currentThread().getName());

}

static class ThreadOne extends Thread{

public ThreadOne(String name){

super(name);

}

@Override

public void run(){

log.info("current thread is : {} start",Thread.currentThread().getName());

for(int i =0;i<10;i++)

{

log.info("current thread is : {} run",Thread.currentThread().getName());

}

log.info("current thread is : {} end",Thread.currentThread().getName());

}

}

}

说明

主线程调用t1.join之后,主线程只有t1的锁进入阻塞状态

运行结果

2019-07-29 20:14:21,551 [t1] INFO JoinTest - current thread is : t1 start

2019-07-29 20:14:21,551 [t1] INFO JoinTest - current thread is : t1 run

2019-07-29 20:14:21,551 [t1] INFO JoinTest - current thread is : t1 run

2019-07-29 20:14:21,551 [t1] INFO JoinTest - current thread is : t1 run

2019-07-29 20:14:21,551 [t1] INFO JoinTest - current thread is : t1 run

2019-07-29 20:14:21,551 [t1] INFO JoinTest - current thread is : t1 run

2019-07-29 20:14:21,551 [t1] INFO JoinTest - current thread is : t1 run

2019-07-29 20:14:21,551 [t1] INFO JoinTest - current thread is : t1 run

2019-07-29 20:14:21,551 [t1] INFO JoinTest - current thread is : t1 run

2019-07-29 20:14:21,551 [t1] INFO JoinTest - current thread is : t1 run

2019-07-29 20:14:21,551 [t1] INFO JoinTest - current thread is : t1 run

2019-07-29 20:14:21,551 [t1] INFO JoinTest - current thread is : t1 end

2019-07-29 20:14:21,551 [main] INFO JoinTest - current thread is : main run

2019-07-29 20:14:21,551 [main] INFO JoinTest - current thread is : main end

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/512829.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flink on Zeppelin 流计算处理最佳实践

简介&#xff1a; 欢迎钉钉扫描文章底部二维码进入 EMR Studio 用户交流群 直接和讲师交流讨论~ 点击以下链接直接观看直播回放&#xff1a;https://developer.aliyun.com/live/247106 开源大数据社区 & 阿里云 EMR 系列直播 第十二期 主题&#xff1a;Flink on Zeppelin…

python windows自动化 爬虫_使用Python实现自动化截取Windows系统屏幕

文章首发于我的技术博客&#xff1a;你可以在上面看到更多的Python教程和python爬虫自动化截屏有什么用呢&#xff1f;为什么要实现自动化截屏呢&#xff1f;其实&#xff0c;在某些特殊的场景下&#xff0c;记录电脑使用者的操作还是很有必要的。比如&#xff0c;银行记录柜员…

储留香:一个智能运维系统就是一个中枢神经系统,我说的!

简介&#xff1a; 运维系统可以像神经系统一样&#xff0c;首先&#xff0c;做到数据的统一汇总&#xff1b;其次&#xff0c;可以对数据进行识别筛选输出有效信息&#xff1b;再次&#xff0c;可以预先感知到异常风险&#xff0c;并进行有效规避。而日志服务SLS凭借出色的数据…

携程发布2021第三季度财报:营收53亿元 国际国内旅游市场“攻守”同发力

2021年12月16日&#xff0c;携程集团&#xff08;纳斯达克&#xff1a;TCOM及香港联交所&#xff1a;9961&#xff09;发布截至2021年9月30日第三季度未经审计的财务业绩。第三季度实现营收53亿元&#xff0c;经调整EBITDA&#xff08;税息折旧摊销前利润&#xff09;为5.37亿元…

java线性表源代码_线性表java实现之顺序存储源码

源码&#xff1a;class SequenceList{private int size0;//表大小private int max_length;//表长private final int default_length 20;//默认长度private Object[] o;//初始化public SequenceList(){max_length default_length;o new Object[max_length];}public SequenceL…

云上资源编排的思与悟

简介&#xff1a; 在传统软件架构下&#xff0c;撇开业务层代码&#xff0c;都需要部署计算节点、存储资源、网络资源&#xff0c;然后安装、配置操作系统等。而云服务本质上是实现 IT 架构软件化和 IT 平台智能化&#xff0c;通过软件的形式定义这些硬件资源&#xff0c;充分抽…

不用网关或代理的单点远程办公如何实现,Aruba推出EdgeConnect Microbranch

Aruba日前宣布推出全新EdgeConnect Microbranch解决方案&#xff0c;针对混合办公环境的家庭办公室和小型办公室的网络解决方案&#xff0c;可供远程工作人员通过单个Wi-Fi接入点 (AP) &#xff0c;安全地访问办公室内所有的传统办公服务&#xff0c;而无需在远程站点部署网关、…

阿里云力夺FewCLUE榜首!知识融入预训练+小样本学习的实战解析

简介&#xff1a; 7月8日&#xff0c;中文语言理解权威评测基准CLUE公开了中文小样本学习评测榜单最新结果&#xff0c;阿里云计算平台PAI团队携手达摩院智能对话与服务技术团队&#xff0c;在大模型和无参数限制模型双赛道总成绩第一名&#xff0c;决赛答辩总成绩第一名。 作…

java 线程 内存分配内存_漫谈JAVA语言的内存分配

在说JAVA语言的内存分配之前&#xff0c;我们先聊聊OS的Memory Management&#xff0c;这是学习操作系统课程的一个重要内容。从这里开始理解内存分配有利于理解的更深入。我们知道物理内存是由page 和segment 方式混合管理的&#xff0c;映射的过程如下图所示&#xff1a;从物…

【产品干货】经典营销模型的产品化介绍

简介&#xff1a; 为什么说Quick Audience是集数据资产构建、用户分析、精准营销投放、跨端社交互动和全域会员管理为一体的全域消费者运营平台&#xff0c;其中一个很大的原因是置入了经典营销模型&#xff0c;如RFM模型与AIPL模型&#xff0c;由方法论支撑消费者运营&#xf…

python 多线程 廖雪峰_python中多线程与多进程中的数据共享问题

之前在写多线程与多进程的时候&#xff0c;因为一般情况下都是各自完成各自的任务&#xff0c;各个子线程或者各个子进程之前并没有太多的联系&#xff0c;如果需要通信的话我会使用队列或者数据库来完成&#xff0c;但是最近我在写一些多线程与多进程的代码时&#xff0c;发现…

填平数据、产品、模式需求鸿沟,浪潮云发布新一代行业云 MEP战略

围绕安全这一核心&#xff0c;浪潮云从新模式&#xff08;New Model&#xff09;、新要素&#xff08;New Essential Factor&#xff09;、新产品&#xff08;New Product&#xff09;三大方面出发&#xff0c;提出新一代行业云MEP战略。 出品 | CSDN云计算 12月16日&#xff0…

hpsocket java代码_HPSocket介绍与使用

一、HPSocket介绍HP-Socket是一套通用的高性能TCP/UDP/HTTP 通信框架&#xff0c;包含服务端组件、客户端组件和Agent组件&#xff0c;广泛适用于各种不同应用场景的TCP/UDP/HTTP通信系统&#xff0c;提供C/C、C#、Delphi、E(易语言)、Java、Python等编程语言接口。HP-Socket对…

Dapr 在阿里云原生的实践

简介&#xff1a; Faas 场景下&#xff0c;比较吸引用户的是成本和研发效率&#xff0c;成本主要通过按需分配和极致的弹性效率来达成。而应用开发者期望通过 FaaS 提供多语言的编程环境&#xff0c;提升研发效率&#xff0c;包括启动时间、发布时间、开发的效率。​ 作者&…

postgre 生成数据库html文档_还在手动整理数据库文档?试试这个(螺丝钉)数据库文档生成工具...

简介在企业级开发中、我们经常会有编写数据库表结构文档的时间付出&#xff0c;从业以来&#xff0c;待过几家企业&#xff0c;关于数据库表结构文档状态&#xff1a;要么没有、要么有、但都是手写、后期运维开发&#xff0c;需要手动进行维护到文档中&#xff0c;很是繁琐、如…

OpenFaaS - 以自己的方式运行容器化函数

作者 | Addo Zhang来源 | 云原生指北译者注&#xff1a; 本文篇幅较长&#xff0c;有助于了解 FaaS 和 OpenFaaS。作者分别从开发人员和运维人员的视角来了解 OpenFaaS&#xff0c;对了解新的技术是个很好的方式。本文翻译自 Ivan Velichko[1] 的 OpenFaaS - Run Containerized…

技术人生第5篇——浅谈如何成为技术一号位?

简介&#xff1a; 认清每个人自己在日常工作中的思维定式非常重要&#xff0c;有助于转变自己对很多事情的认知&#xff0c;而这种转变也会从根本上带来行为上的变化。也就是说&#xff0c;可以通过理论分析和实践&#xff0c;来共同完成对个人实际生活的影响。今天这篇文章&am…

元宇宙真的是「割韭菜」吗?

作者 | 小枣君来源 | 鲜枣课堂我们究竟该如何看待元宇宙&#xff1f;元宇宙为什么会火&#xff1f;它到底有没有价值&#xff1f;它真的是“割韭菜”吗&#xff1f;今天这篇文章&#xff0c;小枣君想说说自己的看法。█ 元宇宙为什么会火&#xff1f;元宇宙的蹿红速度&#xff…

阿里仿真灰度变更测试简介

简介&#xff1a; 基础网络产品的生命周期大致包含研发、架构、交付、优化和运营等几个环节&#xff0c;每一个环节的质量保证都涉及重要的一环&#xff0c;即预期验证测试。本文将重点讲解一下如何在仿真测试平台进行灰度变更测试&#xff0c;从而保证变更的稳定性。 作者 | 聪…

树莓派开始玩转linux pdf_用树莓派构建 Kubernetes 集群 | Linux 中国

将 Kubernetes 安装在多个树莓派上&#xff0c;实现自己的“家庭私有云”容器服务。• 来源&#xff1a;linux.cn • 作者&#xff1a;Chris Collins • 译者&#xff1a;Xingyu.Wang •(本文字数&#xff1a;14330&#xff0c;阅读时长大约&#xff1a;18 分钟)将 Kubernetes …