《Java多线程编程核心技术》读后感(十一)
《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多线程编程核心技术》读后感(十一)相关推荐
- java多线程编程同步方法_实践【Java多线程编程核心技术】系列:同步方法造成的无限等待...
本文实践来自于[Java多线程编程核心技术]一书! 同步方法容易造成死循环,如-- 类Service.java: package service; public class Service { syn ...
- 《Java多线程编程核心技术》——1.5节sleep()方法
本节书摘来自华章社区<Java多线程编程核心技术>一书中的第1章,第1.5节sleep()方法,作者高洪岩,更多章节内容可以访问云栖社区"华章社区"公众号查看 1.5 ...
- 《Java多线程编程核心技术》读书笔记
为什么80%的码农都做不了架构师?>>> <Java多线程编程核心技术>读书笔记. ###第一章 Java多线程技能 使用Java多线程两种方式. 继承Thread ...
- Java 多线程编程核心技术
课程介绍 多线程编程在最大限度利用计算资源.提高软件服务质量方面扮演着至关重要的角色,而掌握多线程编程也成为了广大开发人员所必须要具备的技能. 本课程以基本概念.原理方法为主线,每篇文章结合大量演示实 ...
- Java多线程编程核心技术-多线程基础使用
导语 想要学习一个新的技术就必须要无限的接近它,深入的了解它,了解一个东西的步骤就是由浅入深的去深入的了解它.下面这个专题博主会带着大家共同学习Java多线程的核心编程技术,从入门到深入,也欢迎大 ...
- 好读书不求甚解(一)Java多线程编程核心技术
第1章 Java多线程技能 第2章 对象及变量的并发访问 1 synchronized同步方法 2 synchronized同步代码块 3 volatile 第3章 线程间通信 1 等待通知机制 2 ...
- 《Java多线程编程核心技术》读后感(十四)
单例模式与多线程 立即加载/饿汉模式 立即加载就是使用类的时候已经将对象创建完毕,常见的实现办法就是直接new实例化. 立即加载/饿汉模式实在调用方法前,实例已经被创建了 package Six;pu ...
- 读后感Java多线程编程核心技术十二
类ThreadLocal的使用 主要解决的是每个线程绑定自己的值,可以将ThreadLocal类比喻成全局存放数据的盒子,盒子中可以存储每个线程私有数据. 类ThreadLocal解决的是变量在不同线 ...
- 《Java多线程编程核心技术》读后感(七)
volatile关键字 主要作用是使变量在多个线程间可见. 关键字volatile与死循环 package Second;public class PrintString {private boole ...
最新文章
- 自己写的一个BMP转PNG工具BMP2PNGen
- linux下eclipse cdt主函数main参数值传递设置
- 台达伺服控制器接线图_台达驱控一体三轴伺服驱动器ASDA-M-R系列无骨线圈绕线机解决方案...
- event.keyCode列表
- iPhone上编辑html,在iphone上重新格式化一个简单的html页面
- verilog coding style_韩嫕:坚持coding
- Hdoj 2563.统计问题 题解
- linux mv命令源码,linux命令学习(8):mv命令
- python能做什么-大家都在学的 Python,可以用来干什么?
- Python数据可视化-matplotlib and seaborn
- 在VC中如何将float型转换成字符数组
- 操作系统总结之 输入输出系统(下)
- CentOS 安装JDK8
- Mac安装Xcode
- 方舟手游服务器延迟太高怎么办,方舟手机版服务器延迟太高 | 手游网游页游攻略大全...
- python3 证件照批量换背景
- 韩国研发人工智能武器 遭30国专家联名抵制:和你绝交!
- Linux下搭建ESP-IDF 开发环境教程,适合ESP32/S2/C3/S3系列模组二次开发
- 第一场嵌入式笔试——CVTE嵌入式应用工程师
- 抖音、快手、B站、小红书,品牌如何选对投放平台?