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

一、join() 作用

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

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

二、区别

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

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

三、实例

  创建join_sleep_1项目

  

  类ThreadA.java代码如下

  1. package extthread;
  2.  
  3. public class ThreadA extends Thread {
  4.  
  5. private ThreadB b;
  6.  
  7. public ThreadA(ThreadB b) {
  8. super();
  9. this.b = b;
  10. }
  11.  
  12. @Override
  13. public void run() {
  14. try {
  15. synchronized (b) {
  16. b.start();
  17. Thread.sleep(6000);
  18. }
  19. } catch (InterruptedException e) {
  20. e.printStackTrace();
  21. }
  22. }
  23. }

类ThreadB.java代码如下

  1. package extthread;
  2.  
  3. public class ThreadB extends Thread {
  4.  
  5. @Override
  6. public void run() {
  7. try {
  8. System.out.println(" b run begin timer="
  9. + System.currentTimeMillis());
  10. Thread.sleep(5000);
  11. System.out.println(" b run end timer="
  12. + System.currentTimeMillis());
  13. } catch (InterruptedException e) {
  14. e.printStackTrace();
  15. }
  16. }
  17.  
  18. synchronized public void bService() {
  19. System.out.println("��ӡ��bService timer=" + System.currentTimeMillis());
  20. }
  21.  
  22. }

类ThreadC.java代码如

  1. package extthread;
  2.  
  3. public class ThreadC extends Thread {
  4.  
  5. private ThreadB threadB;
  6.  
  7. public ThreadC(ThreadB threadB) {
  8. super();
  9. this.threadB = threadB;
  10. }
  11.  
  12. @Override
  13. public void run() {
  14. threadB.bService();
  15. }
  16. }

Run.java 代码

  1. package test.run;
  2.  
  3. import extthread.ThreadA;
  4. import extthread.ThreadB;
  5. import extthread.ThreadC;
  6.  
  7. public class Run {
  8. public static void main(String[] args) {
  9.  
  10. try {
  11. ThreadB b = new ThreadB();
  12.  
  13. ThreadA a = new ThreadA(b);
  14. a.start();
  15.  
  16. Thread.sleep(1000);
  17.  
  18. ThreadC c = new ThreadC(b);
  19. c.start();
  20. } catch (InterruptedException e) {
  21. e.printStackTrace();
  22. }
  23. }
  24. }

结果

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

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


下面实验修改ThreadA.java

  1. package extthread;
  2.  
  3. public class ThreadA extends Thread {
  4.  
  5. private ThreadB b;
  6.  
  7. public ThreadA(ThreadB b) {
  8. super();
  9. this.b = b;
  10. }
  11.  
  12. @Override
  13. public void run() {
  14. try {
  15. synchronized (b) {
  16. b.start();
  17. b.join();
  18. for (int i = 0; i < Integer.MAX_VALUE; i++) {
  19. String newString = new String();
  20. Math.random();
  21. }
  22. }
  23. } catch (InterruptedException e) {
  24. e.printStackTrace();
  25. }
  26. }
  27. }

结果如下

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

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

join() 和 sleep() 区别的更多相关文章

  1. join 和 union 区别

    JOIN和UNION区别 join 是两张表做交连后里面条件相同的部分记录产生一个记录集,union是产生的两个记录集(字段要一样的)并在一起,成为一个新的记录集 .JOIN用于按照ON条件联接两个表 ...

  2. sql的left join 、right join 、inner join之间的区别

    sql中left join .right join .inner join之间的区别 left join (左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 : right join (右 ...

  3. inner join 与 left join 之间的区别

    关于inner join 与 left join 之间的区别,以前以为自己搞懂了,今天从前端取参数的时候发现不是预想中的结果,才知道问题出在inner join 上了. 需求是从数据库查数据,在前端以 ...

  4. Oracle中 (+)与left join 的用法区别

    Oracle中 (+)与left join 的用法区别 原创 2017年01月11日 13:33:42 6648 select * from a,b where a.id=b.id(+); (+)写在 ...

  5. inner join(inner可省) 与 left join 之间的区别

    关于inner join 与 left join 之间的区别,以前以为自己搞懂了,今天从前端取参数的时候发现不是预想中的结果,才知道问题出在inner join 上了. 需求是从数据库查数据,在前端以 ...

  6. 1.JOIN和UNION区别

    1.JOIN和UNION区别join 是两张表做交连后里面条件相同的部分记录产生一个记录集,union是产生的两个记录集(字段要一样的)并在一起,成为一个新的记录集 . JOIN用于按照ON条件联接两 ...

  7. left join 、right join 和inner join之间的区别

    SQL的left join .right join 和inner join之间的区别 left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录  right join(右联接) ...

  8. Java线程中yield与join方法的区别

    长期以来,多线程问题颇为受到面试官的青睐.虽然我个人认为我们当中很少有人能真正获得机会开发复杂的多线程应用(在过去的七年中,我得到了一个机会),但是理解多线程对增加你的信心很有用.之前,我讨论了一个w ...

  9. left join,right join,inner join,full join之间的区别

    参考 https://www.cnblogs.com/assasion/p/7768931.html https://blog.csdn.net/rongbo_j/article/details/46 ...

  10. join和+的区别

    连接字符串的时候可以用join也可以用+,但这两者有没有区别呢? 我们先来看一下用join和+连接字符串的例子 str1 = " ".join(["hello" ...

随机推荐

  1. 转载黑客是如何黑到你手机的?绝对涨姿势,一位黑客的Wi-Fi入侵实录!

        声明:这是一虚构的故事,因此对图片均进行了模糊化处理.内容整理自网络! 故事的主人公小黑是一名从事IT相关工作的技术宅男.五一长假来临,宅在家中的他相当无聊,打开手机上的Wi-Fi模块,发现附 ...

  2. sqlplus能登录但查询数据报ORA-00942: 表或视图不存在

    在表名前加表所属的用户就能查了: SELECT * FROM ABC.TABLENAME;(ABC是表的OWNER)

  3. loj#6485. LJJ 学二项式定理(单位根反演)

    题面 传送门 题解 首先你要知道一个叫做单位根反演的东西 \[{1\over k}\sum_{i=0}^{k-1}\omega^{in}_k=[k|n]\] 直接用等比数列求和就可以证明了 而且在模\ ...

  4. [Oracle入门级]知识概况

    oracle各个版本间的主要技术更新 oracle 增加数据库创建和存储对象 oracle 8i 整体性能提升 oracle9i 实施应用集群 oracle 10g 支持网格计算 oracle 11g ...

  5. java webservices 以Axis1.4方式 调用sap webservice接口.

    1. 首先需要下载Axis1.4 jar包,这个必应搜索大把,下载下来后把jar包加入eclipse工程项目路径中即可. 2. 下载mail.jar和activation.jar 俩个包.下载地址:h ...

  6. 5.Min Stack(能返回最小数的栈)

    Level:   Easy 题目描述: Design a stack that supports push, pop, top, and retrieving the minimum element ...

  7. git基础命令整理

    首先安装git,然后选择一个文件夹做初始化!! yum -y install git                        ### 安装 git init                    ...

  8. C++使用using namespace std报错分析与解决方案

    一句话概括,不能同时使用using 和include ***.h: 详细传送门:https://blog.csdn.net/m0_37876745/article/details/78565315

  9. keras调用预训练模型分类

    在网上看到一篇博客,地址https://www.pyimagesearch.com/2017/03/20/imagenet-vggnet-resnet-inception-xception-keras ...

  10. POJ1054 The Troublesome Frog

    题目来源:http://poj.org/problem?id=1054 题目大意: 有一种青蛙在晚上经过一片稻田,在庄稼上跳跃,会把庄稼压弯.这让农民很苦恼.我们希望通过分析青蛙跳跃的路径,找出对稻田 ...