作用: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. php opcache 详解

    PHP性能提升之OPcache相关参数详解 工具 memory 发布于December 15, 2016 标签: PHP OPcache 通过将 PHP 脚本预编译的字节码存储到共享内存中来提升 PH ...

  2. [洛谷 P4612][COCI 2011-2012#7] Setnja

    传送门 TM :setnja (1S256M) 一个人要散步去会见他的 N 个朋友(按给定的顺序会见).我们可以理解成他们都住在一个 很大的网格内,每个朋友住其中的一个单元格,所有人每一步都可以走到相 ...

  3. CF914E Palindromes in a Tree(点分治)

    题面 洛谷 CF 题解 题意:给你一颗 n 个顶点的树(连通无环图).顶点从 1 到 n 编号,并且每个顶点对应一个在'a'到't'的字母. 树上的一条路径是回文是指至少有一个对应字母的排列为回文. ...

  4. 大素数判断和素因子分解(miller-rabin,Pollard_rho算法) 玄学快

    大数因数分解Pollard_rho 算法 复杂度o^(1/4) #include <iostream> #include <cstdio> #include <algor ...

  5. 离散化test

    #include<bits/stdc++.h> using namespace std; const int maxn = 1e6+11; int ll[maxn],rr[maxn],ma ...

  6. webpacke

    webpacke   安装 首先要安装 Node.js, Node.js 自带了软件包管理器 npm 用npm 安装webpack $ npm install webpack -g 此时 Webpac ...

  7. PIE SDK应用掩膜

    1.算法功能简介 当对一幅图像应用掩膜时, 1 值的区域被保留, 0 值的区域被舍弃( 1 值区域被处理, 0 值区域被屏蔽不参与计算). PIE SDK支持算法功能的执行,下面对应用掩膜算法功能进行 ...

  8. oracle 笔记---(一)

    +查看主节点和副节点 oclumon manage -get MASTER REPLICA +查看当前的统计信息和保存的时间段 oclmon manage -get repsize +收集时间段内的节 ...

  9. 97 条 Linux 运维工程师常用命令总结[转]

    1.ls [选项] [目录名 | 列出相关目录下的所有目录和文件 -a 列出包括.a开头的隐藏文件的所有文件 -A 通-a,但不列出"."和".." -l 列出 ...

  10. 解决ios、微信移动端的position: fixed; 支持性不好的问题 && 禁用下拉暴露黑底的功能

    解决ios.微信移动端的position: fixed; 支持性不好的问题 在chrome中的多个部分使用了position: fixed之后,都可以正常的布局,但是放在微信上却出现了不能正常显示的问 ...