来源于《Java多线程编程核心技术》

一、join() 作用

在很多情况,主线程创建并启动子线程,如果子线程中需要进行大量的耗时计算,主线程往往早于子线程结束。这时,如果主线程想等待子线程执行结束之后再结束,比如子线程处理一个数据,主线程要取得这个数据,就要用待jion() 方法。

方法join()的作用是等待线程对象的销毁

二、区别

  sleep(long)方法在睡眠时不释放对象锁

  join(long)方法在等待的过程中释放对象锁

三、实例

  创建join_sleep_1项目

  

  类ThreadA.java代码如下

 package extthread;

 public class ThreadA extends Thread {

     private ThreadB b;

     public ThreadA(ThreadB b) {
super();
this.b = b;
} @Override
public void run() {
try {
synchronized (b) {
b.start();
Thread.sleep(6000);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

类ThreadB.java代码如下

 package extthread;

 public class ThreadB extends Thread {

     @Override
public void run() {
try {
System.out.println(" b run begin timer="
+ System.currentTimeMillis());
Thread.sleep(5000);
System.out.println(" b run end timer="
+ System.currentTimeMillis());
} catch (InterruptedException e) {
e.printStackTrace();
}
} synchronized public void bService() {
System.out.println("��ӡ��bService timer=" + System.currentTimeMillis());
} }

类ThreadC.java代码如

 package extthread;

 public class ThreadC extends Thread {

     private ThreadB threadB;

     public ThreadC(ThreadB threadB) {
super();
this.threadB = threadB;
} @Override
public void run() {
threadB.bService();
}
}

Run.java 代码

 package test.run;

 import extthread.ThreadA;
import extthread.ThreadB;
import extthread.ThreadC; public class Run {
public static void main(String[] args) { try {
ThreadB b = new ThreadB(); ThreadA a = new ThreadA(b);
a.start(); Thread.sleep(1000); ThreadC c = new ThreadC(b);
c.start();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

结果

由于线程ThreadA使用Thread.sleep(long)方法一直持有ThreadB对象的锁,时间达到6秒,所以线程C只有在ThreadA时间到达6秒后释放ThreadB的锁时,才可以调用ThreadB中的同步方法Synchronized public void bService()

上面实验证明Thread.sleep(long)不释放锁


下面实验修改ThreadA.java

 package extthread;

 public class ThreadA extends Thread {

     private ThreadB b;

     public ThreadA(ThreadB b) {
super();
this.b = b;
} @Override
public void run() {
try {
synchronized (b) {
b.start();
b.join();
for (int i = 0; i < Integer.MAX_VALUE; i++) {
String newString = new String();
Math.random();
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

结果如下

由于线程ThreadA释放了ThreadB的锁,所以线程ThreadC可以调用ThreadB中的同步方法synchronized public void bService()

实验证明join(long)方法具有释放锁的特点

最新文章

  1. System.Threading.Timer 定时器的用法
  2. LAMP 之 mysql 安装
  3. 【转】ORACLE日期时间 等函数大全
  4. HDU3757
  5. [转]编写高性能的Lua代码
  6. Gradle之恋-任务2
  7. [Spark内核] 第33课:Spark Executor内幕彻底解密:Executor工作原理图、ExecutorBackend注册源码解密、Executor实例化内幕、Executor具体工作内幕
  8. [Swift]LeetCode802. 找到最终的安全状态 | Find Eventual Safe States
  9. 如何优雅的运行起jmeter
  10. 连接HTTP服务器
  11. HTTP笔记01-http相关的基础知识
  12. html-列表-3
  13. 【Windows】Windows中解析DOS的for命令使用
  14. uchome四大常用入口文件
  15. Linux入门-5 用户及权限基础
  16. IntelliJ IDEA16 热部署,解决每次修改java文件就得重启tomcat的问题
  17. 洛谷 P1291 [SHOI2002]百事世界杯之旅 解题报告
  18. Android studio Unsupported major.minor version 52.0
  19. LeetCode:数组中的第K个最大元素【215】
  20. EDID真实数据块,请参考标准文档仔细核对

热门文章

  1. jmeter 阶梯式加压测试
  2. 公司内部Wiki及搭建wiki系统-confluence
  3. epoll简介
  4. java基础之流程控制语句
  5. Hyperledger Fabric java chaincode 编译部署(1.4V)
  6. GuavaCache简介(一)
  7. python3查询mysql数据
  8. BFS【bzoj1667】: [Usaco2006 Oct]Cows on Skates滑旱冰的奶牛
  9. 轻量级编辑器透彻指南--Notepad++
  10. log4j配置文件及java调用 每个级别输出到不同的文件