作用: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. struts2学习笔记(四)——访问Servlet的API&结果跳转&数据封装

    一.Struts2访问Servlet的API 前面已经对Struts2的流程执行完成了,但是如果表单中有参数如何进行接收?又或者我们需要向页面保存一些数据,又要如何完成呢?我们可以通过学习Struts ...

  2. flask中的蓝图 Blueprint

    模块化 随着flask程序越来越复杂,我们需要对程序进行模块化的处理,之前学习过python的模块化管理,于是针对一个简单的flask程序进行模块化处理 简单来说,Blueprint 是一个存储操作方 ...

  3. Python web前端 06 运算符 循环

    Python web前端 06 运算符 循环 一.运算符 #JS六大数据类型 #number 数字 #string 字符串 #boolean 布尔型 #function 函数 #undefined 未 ...

  4. openssl-devel和openssl 是什么具体关系

    [转自] https://zhidao.baidu.com/question/919579491101051499.html Redhat在封装openssl的时候,把openssl分成了几个部分,执 ...

  5. 2019.3.28 JDBC相关

    JDBC(Java Data Base Connectivity) JDBC是一组用Java编写的类和接口 使用JDBC的好处: 1.Java的开发人员完全不需要关心数据库的连接方式和实现手段 2.提 ...

  6. 超文本传送协议 HTTP

    超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议.所有的WWW文件都必须遵守这个标准. HTTP是一个属于应用层的面向对象的协议, ...

  7. Jmeter4.0----HTTP Cookie管理器(9)

    1.说明 在脚本编写的过程中,我们常常会遇到用户登录之后的相关操作,但是又不想去通过脚本先模拟用户登录,再使用cookie值保持登录,做后续的操作的情况下,我们就会用到HTTP Cookie管理. H ...

  8. redis——基础知识

    redis默认端口:6379 一.为何要用redis? redis广义上来讲类似于mongodb,rabitmq,都属于nosql——即非关系型数据库中的一种,通常而言,mongodb不能说是mq(消 ...

  9. oracle 控制文件损坏处理

    一, 故障模拟 控制文件损坏 发现关闭不了 强制关闭   故障恢复   发现已经执行到mont阶段,因为这个不依靠控制文件 进入整段日志 cd /u01/app/oracle/diag/rdbms/o ...

  10. js栈内存和堆内存的区别

    首先JavaScript中的变量分为基本类型和引用类型.基本类型就是保存在栈内存中的简单数据段,而引用类型指的是那些保存在堆内存中的对象. 1.基本类型 基本类型有Undefined.Null.Boo ...