《Java多线程编程核心技术》读后感(十一)

方法join的使用

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

学习join前的铺垫

package Third;public class MyThread extends Thread {@Overridepublic void run() {try {int secondValue = (int) (Math.random() * 10000);System.out.println(secondValue);Thread.sleep(secondValue);} catch (InterruptedException e) {// TODO Auto-generated catch block
            e.printStackTrace();}}}

package Third;public class Test {public static void main(String[] args) {MyThread threadTest = new MyThread();threadTest.start();// Thread.sleep(?)System.out.println("我想当threadTest对象执行完毕后我再执行");System.out.println("但上面代码中的sleep()中的值应该写多少呢?");System.out.println("答案是:根据不能确定:)");}}

sleep()多少不能确定

用join()方法来解决

package Third;public class Test {public static void main(String[] args) {try {MyThread threadTest = new MyThread();threadTest.start();threadTest.join();System.out.println("我想当threadTest对象执行完毕后我再执行,我做到了");} catch (InterruptedException e) {e.printStackTrace();}}}

方法join的作用是使所属的线程对象X正常执行run()方法中的任务,而使当前线程z进行无限期的阻塞,等待线程x销毁后再继续执行线程z后面的代码。

方法join具有使线程排队运行的作用,有些类似同步的运行效果。join与synchronized的区别是:join在内部使用wait()方法进行等待,而synchronized关键字使用的是“”对象监视器“”原理做为同步。

方法join与异常

在join过程中,如果当前线程对象被中断,则当前线程出现异常

package Third;public class ThreadA extends Thread {@Overridepublic void run() {for (int i = 0; i < Integer.MAX_VALUE; i++) {String newString = new String();Math.random();}}
}

package Third;public class ThreadB extends Thread {@Overridepublic void run() {try {ThreadA a = new ThreadA();a.start();a.join();System.out.println("线程B在run end处打印了");} catch (InterruptedException e) {System.out.println("线程B在catch处打印了");e.printStackTrace();}}}

package Third;public class ThreadC extends Thread {private ThreadB threadB;public ThreadC(ThreadB threadB) {super();this.threadB = threadB;}@Overridepublic void run() {threadB.interrupt();}}

方法join(long)使用

参数是设定等待的时间

package Third;public class MyThread extends Thread {@Overridepublic void run() {try {System.out.println("begin Timer=" + System.currentTimeMillis());Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}}}

package Third;public class Test {public static void main(String[] args) {try {MyThread threadTest = new MyThread();threadTest.start();threadTest.join(2000);//只等2秒//Thread.sleep(2000);
System.out.println("  end timer=" + System.currentTimeMillis());} catch (InterruptedException e) {e.printStackTrace();}}}

package Third;public class Test {public static void main(String[] args) {try {MyThread threadTest = new MyThread();threadTest.start();//threadTest.join(2000);//只等2秒Thread.sleep(2000);System.out.println("  end timer=" + System.currentTimeMillis());} catch (InterruptedException e) {e.printStackTrace();}}}

方法join(long)与sleep(long)的区别

方法join(long)的功能在内部是使用wait(long)方法来实现的,所以join(long)方法具有释放锁的特点。

从源代码中可以了解到,当执行wait(long)方法后,当前线程的锁被释放,那么其他线程就可以调用此线程中的同步方法了。

而Thread.sleep(long)方法却不释放锁,下面的实验证Thread.sleep(long)不释放锁的特点

package Third;public class ThreadA extends Thread {private ThreadB b;public ThreadA(ThreadB b) {super();this.b = b;}@Overridepublic void run() {try {synchronized (b) {b.start();Thread.sleep(6000);// Thread.sleep()不释放锁
            }} catch (InterruptedException e) {e.printStackTrace();}}
}

package Third;public class ThreadB extends Thread {@Overridepublic 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());}}

package Third;public class ThreadC extends Thread {private ThreadB threadB;public ThreadC(ThreadB threadB) {super();this.threadB = threadB;}@Overridepublic void run() {threadB.bService();}}

package Third;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();}}}

下面验证Thread.sleep(long)释放锁的特点

更改上面的ThreadA.java

package Third;public class ThreadA extends Thread {private ThreadB b;public ThreadA(ThreadB b) {super();this.b = b;}@Overridepublic void run() {try {synchronized (b) {b.start();b.join();// 说明join释放锁了for (int i = 0; i < Integer.MAX_VALUE; i++) {String newString = new String();Math.random();}}} catch (InterruptedException e) {e.printStackTrace();}}
}

方法join()后面的代码提前运行:出现意外

package Third;public class ThreadA extends Thread {private ThreadB b;public ThreadA(ThreadB b) {super();this.b = b;}@Overridepublic void run() {try {synchronized (b) {System.out.println("begin A ThreadName="+ Thread.currentThread().getName() + "  "+ System.currentTimeMillis());Thread.sleep(5000);System.out.println("  end A ThreadName="+ Thread.currentThread().getName() + "  "+ System.currentTimeMillis());}} catch (InterruptedException e) {e.printStackTrace();}}
}

package Third;public class ThreadB extends Thread {@Overridesynchronized public void run() {try {System.out.println("begin B ThreadName="+ Thread.currentThread().getName() + "  "+ System.currentTimeMillis());Thread.sleep(5000);System.out.println("  end B ThreadName="+ Thread.currentThread().getName() + "  "+ System.currentTimeMillis());} catch (InterruptedException e) {e.printStackTrace();}}
}

package Third;public class Run1 {public static void main(String[] args) {try {ThreadB b = new ThreadB();ThreadA a = new ThreadA(b);a.start();b.start();b.join(2000);System.out.println("                    main end "+ System.currentTimeMillis());} catch (InterruptedException e) {e.printStackTrace();}}
}

方法join()后面的代码提前运行:解释意外

package Third;public class RunFirst {public static void main(String[] args) {ThreadB b = new ThreadB();ThreadA a = new ThreadA(b);a.start();b.start();System.out.println("   main end=" + System.currentTimeMillis());}}

posted on 2017-11-18 21:47 Michael2397 阅读(...) 评论(...) 编辑 收藏

《Java多线程编程核心技术》读后感(十一)相关推荐

  1. java多线程编程同步方法_实践【Java多线程编程核心技术】系列:同步方法造成的无限等待...

    本文实践来自于[Java多线程编程核心技术]一书! 同步方法容易造成死循环,如-- 类Service.java: package service; public class Service { syn ...

  2. 《Java多线程编程核心技术》——1.5节sleep()方法

    本节书摘来自华章社区<Java多线程编程核心技术>一书中的第1章,第1.5节sleep()方法,作者高洪岩,更多章节内容可以访问云栖社区"华章社区"公众号查看 1.5 ...

  3. 《Java多线程编程核心技术》读书笔记

    为什么80%的码农都做不了架构师?>>>    <Java多线程编程核心技术>读书笔记. ###第一章 Java多线程技能 使用Java多线程两种方式. 继承Thread ...

  4. Java 多线程编程核心技术

    课程介绍 多线程编程在最大限度利用计算资源.提高软件服务质量方面扮演着至关重要的角色,而掌握多线程编程也成为了广大开发人员所必须要具备的技能. 本课程以基本概念.原理方法为主线,每篇文章结合大量演示实 ...

  5. Java多线程编程核心技术-多线程基础使用

    导语   想要学习一个新的技术就必须要无限的接近它,深入的了解它,了解一个东西的步骤就是由浅入深的去深入的了解它.下面这个专题博主会带着大家共同学习Java多线程的核心编程技术,从入门到深入,也欢迎大 ...

  6. 好读书不求甚解(一)Java多线程编程核心技术

    第1章 Java多线程技能 第2章 对象及变量的并发访问 1 synchronized同步方法 2 synchronized同步代码块 3 volatile 第3章 线程间通信 1 等待通知机制 2 ...

  7. 《Java多线程编程核心技术》读后感(十四)

    单例模式与多线程 立即加载/饿汉模式 立即加载就是使用类的时候已经将对象创建完毕,常见的实现办法就是直接new实例化. 立即加载/饿汉模式实在调用方法前,实例已经被创建了 package Six;pu ...

  8. 读后感Java多线程编程核心技术十二

    类ThreadLocal的使用 主要解决的是每个线程绑定自己的值,可以将ThreadLocal类比喻成全局存放数据的盒子,盒子中可以存储每个线程私有数据. 类ThreadLocal解决的是变量在不同线 ...

  9. 《Java多线程编程核心技术》读后感(七)

    volatile关键字 主要作用是使变量在多个线程间可见. 关键字volatile与死循环 package Second;public class PrintString {private boole ...

最新文章

  1. 自己写的一个BMP转PNG工具BMP2PNGen
  2. linux下eclipse cdt主函数main参数值传递设置
  3. 台达伺服控制器接线图_台达驱控一体三轴伺服驱动器ASDA-M-R系列无骨线圈绕线机解决方案...
  4. event.keyCode列表
  5. iPhone上编辑html,在iphone上重新格式化一个简单的html页面
  6. verilog coding style_韩嫕:坚持coding
  7. Hdoj 2563.统计问题 题解
  8. linux mv命令源码,linux命令学习(8):mv命令
  9. python能做什么-大家都在学的 Python,可以用来干什么?
  10. Python数据可视化-matplotlib and seaborn
  11. 在VC中如何将float型转换成字符数组
  12. 操作系统总结之 输入输出系统(下)
  13. CentOS 安装JDK8
  14. Mac安装Xcode
  15. 方舟手游服务器延迟太高怎么办,方舟手机版服务器延迟太高 | 手游网游页游攻略大全...
  16. python3 证件照批量换背景
  17. 韩国研发人工智能武器 遭30国专家联名抵制:和你绝交!
  18. Linux下搭建ESP-IDF 开发环境教程,适合ESP32/S2/C3/S3系列模组二次开发
  19. 第一场嵌入式笔试——CVTE嵌入式应用工程师
  20. 抖音、快手、B站、小红书,品牌如何选对投放平台?

热门文章

  1. Valens VS2000 系列HDBaseT2.0延长芯片
  2. 关于云计算的那些问题
  3. 经济法基础——第四章第二节、增值税法律制度
  4. 阿里物联网平台中心网址
  5. 舆情风险怎么分析的解决方案
  6. 可防离职员工冒用身份,合合信息名片全能王与钉钉用数字名片打造安全“围栏”
  7. 徒手打造一款PK 名片全能王 的名片识别应用--名字篇之(如何100%准确提取名字)
  8. 基于逻辑回归的癌症分类预测-良/恶性乳腺癌肿瘤预测及ROC曲线绘制
  9. iOS逆向学习之越狱
  10. 亚马逊S3上传下载文件