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

    join()方法具有能使线程排队运行的作用,有点类似于同步的效果。
 
    join与synchronize的区别:
        join在内部使用wait()方法进行等待,底层用wait()来实现。
        synchronize关键字是以“对象监视器”为原理做同步操作。
 
    join()除了无参方法之外,还重载了join(毫秒)的方法,此方法与sleep(毫秒)的区别是:
        join()操作底层用wait()来实现,可以释放锁。
        sleep()不会释放锁。
 
join()释放锁的demo:
    线程类A:
  1. package com.wang.myjoin;
  2. publicclassThreadAextendsThread{
  3. privateThreadB threadB;
  4. publicThreadA(ThreadB threadB){
  5. this.threadB = threadB;
  6. }
  7. @Override
  8. publicvoid run(){
  9. synchronized(threadB){
  10. threadB.start();
  11. try{
  12. threadB.join();
  13. }catch(InterruptedException e1){
  14. e1.printStackTrace();
  15. }
  16. for(int i =0;i<10000;i++){
  17. System.out.println("b do sth....");
  18. }
  19. }
  20. }
  21. }
线程类B:
  1. package com.wang.myjoin;
  2. publicclassThreadBextendsThread{
  3. @Override
  4. publicvoid run(){
  5. System.out.println("B thread is run.");
  6. try{
  7. Thread.sleep(2000);
  8. }catch(InterruptedException e){
  9. e.printStackTrace();
  10. }
  11. System.out.println("B thread is over.");
  12. }
  13. publicsynchronizedvoid myService(){
  14. for(int i =0;i<100;i++){
  15. System.out.println("myService do sth."+ i);
  16. }
  17. }
  18. }
线程类C:
  1. package com.wang.myjoin;
  2. publicclassThreadCextendsThread{
  3. privateThreadB threadB;
  4. publicThreadC(ThreadB threadB){
  5. this.threadB = threadB;
  6. }
  7. @Override
  8. publicvoid run(){
  9. threadB.myService();
  10. }
  11. }
测试类:
  1. package com.wang.myjoin;
  2. publicclassJoinTest{
  3. publicstaticvoid main(String[] args){
  4. ThreadB threadB =newThreadB();
  5. ThreadA threadA =newThreadA(threadB);
  6. threadA.start();
  7. ThreadC threadC =newThreadC(threadB);
  8. threadC.start();
  9. System.out.println("~~~我来测试一下~~~~");
  10. }
  11. }
输出结果:
  1. B thread is run.
  2. ~~~我来测试一下~~~~
  3. myService do sth.0
  4. myService do sth.1
  5. myService do sth.2
  6. .
  7. .
  8. .
  9. myService do sth.99
  10. B thread is over.
  11. b do sth....
  12. b do sth....
  13. .
  14. .
  15. .
可见线程在join()之后是释放锁的,其他线程可以访问同锁的synchronize方法。
      
需要注意的问题:join()后的方法有可能会提前运行:(这个没试出来)
    我们同时执行以下三个操作:
    ①.thread1.start();
    ②.thread2.start();
    ③.sysout
    哪个先运行是不确定的,不过①和②的操作是相同的锁,所以是互斥的。

多线程(七)~join方法的使用的更多相关文章

  1. 转载:Java多线程中join方法的理解

    转载自:http://uule.iteye.com/blog/1101994 thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程.比如在线程B中调用了线程A ...

  2. Java多线程中join方法详解

    join()方法用于让当前执行线程等待join线程执行结束.其实现原理是不停的检查join线程是否存活,如果join线程存活则让当前线程永远等待. join()方法部分实现细节 while(isAli ...

  3. Java多线程中join方法的理解

    thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程.比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B. t.join( ...

  4. 多线程--Thread.join方法

    在Thread类的Api中,Join的作用是让当前线程等待目标线程结束之后才继续执行. thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程.  比如在线程B ...

  5. [javaSE] 多线程(join方法)

    多条线程并发执行,随机切换,调用join()方法,会使当前线程所在的线程(一般主线程)冻结,直到当前线程结束,所在的线程才恢复继续执行 class JoinTestDemo implements Ru ...

  6. 并发编程之多线程基础-join方法及优先级(五)

    join()方法作用 当在主线程当中执行到t1.join()方法时,就认为主线程应该把执行权让给t1 优先级 现代操作系统基本采用时分的形式调度运行的线程,线程分配得到的时间片的多少决定了线程使用处理 ...

  7. Java多线程学习——join方法的使用

    join在线程里面意味着“插队”,哪个线程调用join代表哪个线程插队先执行——但是插谁的队是有讲究了,不是说你可以插到队头去做第一个吃螃蟹的人,而是插到在当前运行线程的前面,比如系统目前运行线程A, ...

  8. 多线程中join方法的含义

    1.作用:调用这个方法的时候,主进程会在这里停住,等待该线程进行完毕再继续往下执行. 如:不使用join的情况: <?php class Join extends Thread { public ...

  9. Java多线程-join方法

    thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程.比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B. 具体例子看链接 ...

  10. “全栈2019”Java多线程第七章:等待线程死亡join()方法详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

随机推荐

  1. FileReader 方法 实现预览图片

    FileReader 方法 方法名 参数 描述 abort none 中断读取 readAsBinaryString file(blob) 将文件读取为二进制码 readAsDataURL file( ...

  2. LeetCode231.2的幂

    231.2的幂 描述 给定一个整数,编写一个函数来判断它是否是 2 的幂次方. 示例 示例 1: 输入: 1 输出: true 解释: 2^0 = 1 示例 2: 输入: 16 输出: true 解释 ...

  3. [原创]在Centos7上搭建私有的Gitlab服务器

    前言 Git作为后起之秀,在版本控制领域占据了头把交椅.Github作为托管式的代码仓库,从代码安全性和网络传输等各个方面考虑,对于个人和公司来讲,具有一定的局限性.Gitlab提供的不同版本的安装包 ...

  4. Restrictions.like() 模糊查询,以及使用DetachedCriteria查询的一般用法

    Restrictions.like() 模糊查询,以及使用DetachedCriteria查询的一般用法 2016-10-10 16:52:38                             ...

  5. 理解Call、Apply、bind

    Apply.call 共同点: 为了改变函数执行时的上下文(简单说就是为了改变当前函数体内的This的指向) 不同点: 传入的参数不一样,func.apply(this,[arg1,arg2]).fu ...

  6. git撤销commit,但未git push的命令

    在git push的时候,有时候我们会想办法撤销git commit的内容 1.找到之前提交的git commit的id git log 找到想要撤销的id 2.git reset –hard id ...

  7. JS实现跨域请求数据--jsonp

    * { margin: 0; padding: 0; } input { width: 300px; height: 30px; border: 1px solid lightgray; margin ...

  8. 【python爬虫】用python编写LOL战绩查询

    介绍一个简单的python爬虫,通过Tkinter创建一个客户端,当输入要查询的LOL用户名称的时候,可以显示出当前用户的所在服务器,当前战力和当前段位. 爬取网页地址:http://lol.duow ...

  9. <div>里用display:block有用么?

    对所有的块元素都没有意义,块元素的dispaly属性默认值为block,没必要再显式定义--除非你之前对块元素的display属性重新定义过. =========================== ...

  10. QQ会员2018春节红包抵扣券项目背后的故事

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 1. 活动数据 截止3月1日手Q运动红包会员礼包发放核销数据 参与红包活动用户数:2亿+ 发券峰值:52w/min 2. 需求背景 2.1 ...