thread1.join()方法阻塞调用此方法的线程,直到线程thread1完成,此线程再继续。

通常用于在main()主线程内,等待其它线程完成再结束main()主线程

    @Test
/**
* output:
* 01234 main end.
* 如果注释掉【标记1】:
* main end.01234
*/
public void test06(){
class Task implements Runnable{
public void run() {
for(int i=0;i<5;i++){
System.out.print(i);
}
}
}
Thread thread1=new Thread(new Task());
thread1.start();
try {
thread1.join(); //标记1
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.print("\tmain end.");
}

线程调用thread1.join()时,必须能够拿到线程thread1对象的锁。

@Test
/**
* output:
* 占用线程
TaskA run:0
TaskA run:1
TaskA run:2
TaskA run:3
TaskA run:4
释放线程
TaskA run:5
TaskA run:6
TaskA run:7
TaskA run:8
TaskA run:9
main end.
*/
public void test07(){
class TaskA implements Runnable{
public void run() {
for(int i=0;i<10;i++){
System.out.println("TaskA run:"+i);
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class TaskB implements Runnable{
Thread thread;
public TaskB(Thread thread) {
this.thread=thread;
}
public void run() {
synchronized(thread){
try {
System.out.println("占用线程");
TimeUnit.SECONDS.sleep(5);
System.out.println("释放线程");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
Thread t1=new Thread(new TaskA());
Thread t2=new Thread(new TaskB(t1));
t2.start();
t1.start();
try {
t1.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("main end.");
}

t2通过synchronized(thread) 获取线程对象t1的锁并TimeUnit.SECONDS.sleep(5)后释放,
再此之前main方法调用t1.join(),因为获得不了t1的对象锁所以阻塞,
当t2释放了t1锁后,main线程join()方法,再等待t1线程执行完成后结束

java Thread.join()的更多相关文章

  1. [译]Java Thread join示例与详解

    Java Thread join示例与详解 Java Thread join方法用来暂停当前线程直到join操作上的线程结束.java中有三个重载的join方法: public final void ...

  2. Java Thread join() 的用法

    Java Thread中, join() 方法主要是让调用改方法的thread完成run方法里面的东西后, 在执行join()方法后面的代码.示例: class ThreadTesterA imple ...

  3. Java Thread.join的作用和原理

    很多人对Thread.join的作用以及实现了解得很少,毕竟这个api我们很少使用.这篇文章仍然会结合使用及原理进行深度分析 内容导航 Thread.join的作用 Thread.join的实现原理 ...

  4. Java Thread.join()方法

    一.使用方式. join是Thread类的一个方法,启动线程后直接调用,例如: Thread t = new AThread(); t.start(); t.join(); 二.为什么要用join() ...

  5. 浅析 Java Thread.join()

    转自:http://blog.csdn.net/bzwm/article/details/3881392 一.在研究join的用法之前,先明确两件事情. 1.join方法定义在Thread类中,则调用 ...

  6. 【转】Java Thread.join()详解

    http://www.open-open.com/lib/view/open1371741636171.html 一.使用方式. join是Thread类的一个方法,启动线程后直接调用,例如: ? 1 ...

  7. Java Thread.join()详解(转)

    (1)join方法是可以中断的(2)在线程joiner在另一个线程t上调用t.join(),线程joiner将被挂起,直到线程t结束(即t.isAlive()返回为false)才恢复 package ...

  8. JAVA THREAD.JOIN方法详解

    一.使用方式. join是Thread类的一个方法,启动线程后直接调用,例如: Thread t = new AThread(); t.start(); t.join(); 二.为什么要用join() ...

  9. Java Thread.join()详解--父线程等待子线程结束后再结束

    目录(?)[+] 阅读目录 一.使用方式. 二.为什么要用join()方法 三.join方法的作用 join 四.用实例来理解 打印结果: 打印结果: 五.从源码看join()方法   join是Th ...

随机推荐

  1. NWERC 2012 Problem J Joint Venture

    刚刚开始想的是用二分的方法做,没想到这个题目这么水,直接暴力就行: 代码: #include<cstdio> #include<algorithm> #define maxn ...

  2. 安装ECMall后报PHP Strict Standards错误,请问如何解决

    Strict Standards: Non-static method ECMall::startup() should not be called statically in /htdocs/ecm ...

  3. OneAlert 入门(四)——事件分派和通知必达

    OneAlert 是国内首个 SaaS 模式的云告警平台,集成国内外主流监控/支撑系统,实现一个平台上集中处理所有 IT 事件,提升 IT 可靠性.有了 OneAlert,你可以更快更合理地为事件划分 ...

  4. 【HDU 4276】The Ghost Blows Light(树形DP,依赖背包)

    The Ghost Blows Light Problem Description My name is Hu Bayi, robing an ancient tomb in Tibet. The t ...

  5. Spring中的事务管理详解

    在这里主要介绍Spring对事务管理的一些理论知识,实战方面参考上一篇博文: http://www.cnblogs.com/longshiyVip/p/5061547.html 1. 事务简介: 事务 ...

  6. cocos2d-x拖动滑块控件CCControlSlider

    #include "GameMusicSetting.h" bool GameMusicSetting::init() { if(!CCLayer::init()) { retur ...

  7. 【转】Xcode7.1环境下上架iOS App到AppStore 流程 -- 不错!!

    原文网址:http://www.jianshu.com/p/a8bd16be122f 1.官网地址 Apple Developer 地址:https://developer.apple.com/mem ...

  8. 【转】你应该知道的十个VirtualBox技巧与高级特性

    原文网址:http://www.searchvirtual.com.cn/showcontent_76463.htm VirtualBox集成的许多功能你可能从来没有使用过,即使你经常用它来运行虚拟机 ...

  9. 我对Burnside定理的理解

    我想了想,发现可以证明burnside定理. 置换:n个元素1,2,-,n之间的一个置换表示1被1到n中的某个数a1取代,2被1到n中的某个数a2取代,直到n被1到n中的某个数an取代,且a1,a2, ...

  10. EF中执行存储过程,获取output返回值

    EF不能直接支持执行存储过程,于是使用转化成执行SQL语句的形式,却怎么也获取不到output的值,折腾的好久,终于解决了,分享下曲折的经历: public int AddVote(int title ...