JAVA多线程 JOIN

对于Java开发人员,多线程应该是必须熟练应用的知识点,特别是开发基于Java语言的产品。本文将深入浅出的表述Java多线程的知识点,在后续的系列里将侧重于Java5由Doug Lea教授提供的Concurrent并行包的设计思想以及具体实现与应用。
如何才能深入浅出呢,我的理解是带着问题,而不是泛泛的看。所以该系列基本以解决问题为主,当然我也非常希望读者能够提出更好的解决问题的方案以及提出更多的问题。由于水平有限,如果有什么错误之处,请大家提出,共同讨论,总之,我希望通过该系列我们能够深入理解Java多线程来解决我们实际开发的问题。
作为开发人员,我想没有必要讨论多线程的基础知识,比如什么是线程? 如何创建等 ,这些知识点是可以通过书本和Google获得的。本系列主要是如何理深入解多线程来帮助我们平时的开发,比如线程池如何实现? 如何应用锁等。
(1)方法Join是干啥用的? 简单回答,同步,如何同步? 怎么实现的? 下面将逐个回答。
自从接触Java多线程,一直对Join理解不了。JDK是这样说的:
join public final void join(long millis)throws InterruptedException Waits at most millis milliseconds for this thread to die. A timeout of 0 means to wait forever.
大家能理解吗? 字面意思是等待一段时间直到这个线程死亡,我的疑问是那个线程,是它本身的线程还是调用它的线程的,上代码:
package concurrentstudy;
/**
*
* @author vma
*/
public class JoinTest {
public static void main(String[] args) {
Thread t = new Thread(new RunnableImpl());
t.start();
try {
t.join(1000);
System.out.println("joinFinish");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
class RunnableImpl implements Runnable {
@Override
public void run() {
try {
System.out.println("Begin sleep");
Thread.sleep(1000);
System.out.println("End sleep");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
结果是:
Begin sleep End sleep joinFinish
明白了吧,当main线程调用t.join时,main线程等待t线程,等待时间是1000,如果t线程Sleep 2000呢
public void run() {
try {
System.out.println("Begin sleep");
// Thread.sleep(1000);
Thread.sleep(2000);
System.out.println("End sleep");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
结果是:
Begin sleep joinFinish End sleep
也就是说main线程只等1000毫秒,不管T什么时候结束,如果是t.join()呢, 看代码:
public final void join() throws InterruptedException {
join(0);
}
就是说如果是t.join() = t.join(0) 0 JDK这样说的 A timeout of 0 means to wait forever 字面意思是永远等待,是这样吗?
其实是等到t结束后。
这个是怎么实现的吗? 看JDK代码:
/**
* Waits at most <code>millis</code> milliseconds for this thread to
* die. A timeout of <code>0</code> means to wait forever.
*
* @param millis the time to wait in milliseconds.
* @exception InterruptedException if any thread has interrupted
* the current thread. The <i>interrupted status</i> of the
* current thread is cleared when this exception is thrown.
*/
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(小提示:Object 提供的方法)。 当main线程调用t.join时候,main线程会获得线程对象t的锁(wait 意味着拿到该对象的锁),调用该对象的wait(等待时间),直到该对象唤醒main线程,比如退出后。
这就意味着main 线程调用t.join时,必须能够拿到线程t对象的锁,如果拿不到它是无法wait的,刚开的例子t.join(1000)不是说明了main线程等待1秒,如果在它等待之前,其他线程获取了t对象的锁,它等待时间可不就是1毫秒了。上代码介绍:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package concurrentstudy;
/**
*
* @author vma
*/
public class JoinTest {
public static void main(String[] args) {
Thread t = new Thread(new RunnableImpl());
new ThreadTest(t).start();
t.start();
try {
t.join();
System.out.println("joinFinish");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
class ThreadTest extends Thread {
Thread thread;
public ThreadTest(Thread thread) {
this.thread = thread;
}
@Override
public void run() {
holdThreadLock();
}
public void holdThreadLock() {
synchronized (thread) {
System.out.println("getObjectLock");
try {
Thread.sleep(9000);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
System.out.println("ReleaseObjectLock");
}
}
}
class RunnableImpl implements Runnable {
@Override
public void run() {
try {
System.out.println("Begin sleep");
Thread.sleep(2000);
System.out.println("End sleep");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
在main方法中 通过new ThreadTest(t).start();实例化ThreadTest 线程对象, 它在holdThreadLock()方法中,通过synchronized (thread),获取线程对象t的锁,并Sleep(9000)后释放,这就意味着,即使main方法t.join(1000),等待一秒钟,它必须等待ThreadTest 线程释放t锁后才能进入wait方法中,它实际等待时间是9000+1000 MS
运行结果是:
getObjectLock Begin sleep End sleep ReleaseObjectLock joinFinish
小结:
本节主要深入浅出join及JDK中的实现。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# JAVA多线程之方法
# JOIN详解
# java
# JOIN
# java基本教程之join方法详解 java多线程教程
# java 中Thread.join()的使用方法
# Java之Thread的join方法实例
# java线程之join方法的使用介绍
# java多线程编程之join方法的使用示例
# Java多线程中关于join方法的使用实例解析
# Java使用join方法暂停当前线程
# Java字符串拼接新方法 StringJoiner用法详解
# 浅谈Java线程Thread.join方法解析
# java中join方法的理解与说明详解
# 多线程
# 深入浅出
# 是这样
# 这就
# 解决问题
# 结果是
# 开发人员
# 到该
# 有什么
# 我也
# 我想
# 带着
# 什么时候
# 之处
# 是怎么
# 请大家
# 它是
# 可以通过
# 希望能
# 可不
相关文章:
大连网站设计制作招聘信息,大连投诉网站有哪些?
企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?
建站之星导航如何优化提升用户体验?
C++用Dijkstra(迪杰斯特拉)算法求最短路径
如何通过WDCP绑定主域名及创建子域名站点?
用v-html解决Vue.js渲染中html标签不被解析的问题
如何快速上传建站程序避免常见错误?
宿州网站制作公司兴策,安徽省低保查询网站?
网站制作话术技巧,网站推广做的好怎么话术?
如何通过老薛主机一键快速建站?
如何通过服务器快速搭建网站?完整步骤解析
深圳 网站制作,深圳招聘网站哪个比较好一点啊?
C++如何编写函数模板?(泛型编程入门)
娃派WAP自助建站:免费模板+移动优化,快速打造专业网站
网站制作与设计教程,如何制作一个企业网站,建设网站的基本步骤有哪些?
如何在云虚拟主机上快速搭建个人网站?
简易网站制作视频教程,使用记事本编写一个简单的网页html文件?
如何在Golang中实现微服务服务拆分_Golang微服务拆分与接口管理方法
网站制作大概要多少钱一个,做一个平台网站大概多少钱?
武清网站制作公司,天津武清个人营业执照注销查询系统网站?
建站之星如何实现PC+手机+微信网站五合一建站?
建站之星后台管理:高效配置与模板优化提升用户体验
成都响应式网站开发,dw怎么把手机适应页面变成网页?
制作网站的基本流程,设计网站的软件是什么?
建站之星手机一键生成:多端自适应+小程序开发快速建站指南
,sp开头的版面叫什么?
建站主机是否等同于虚拟主机?
广州营销型建站服务商推荐:技术优势与SEO优化解析
头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?
建站之星如何配置系统实现高效建站?
c# 在高并发场景下,委托和接口调用的性能对比
山东网站制作公司有哪些,山东大源集团官网?
商务网站制作工程师,从哪几个方面把握电子商务网站主页和页面的特色设计?
网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱?
建站之星上传入口如何快速找到?
建站之星后台密码遗忘或太弱?如何重置与强化?
如何在局域网内绑定自建网站域名?
天津个人网站制作公司,天津网约车驾驶员从业资格证官网?
专业网站制作企业网站,如何制作一个企业网站,建设网站的基本步骤有哪些?
怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?
油猴 教程,油猴搜脚本为什么会网页无法显示?
如何在阿里云服务器自主搭建网站?
宝塔建站后网页无法访问如何解决?
网站设计制作企业有哪些,抖音官网主页怎么设置?
网站制作需要会哪些技术,建立一个网站要花费多少?
电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?
宝塔新建站点为何无法访问?如何排查?
c# 在高并发下使用反射发射(Reflection.Emit)的性能
如何在宝塔面板中修改默认建站目录?
个人网站制作流程图片大全,个人网站如何注销?
*请认真填写需求信息,我们会在24小时内与您取得联系。