java多线程之守护线程以及Join方法
版权声明:本文出自汪磊的博客,转载请务必注明出处。
一、守护线程概述及示例
守护线程就是为其它线程提供"守护"作用,说白了就是为其它线程服务的,比如GC线程。
java程序中线程分两种:用户线程与守护线程,用户线程就是我们平常编写的一个个子线程,比如负责下载的线程,上传数据的线程等。如果一个线程调用了setDaemon(true)方法则变成了守护线程,两种线程本质上没什么区别,但是当一个工程中所有用户线程都执行完了,那么守护线程就没什么服务对象了,此时虚拟机退出,守护线程被销毁。
下面通过一个小Demo示例。编写DaemonThread类,如下:
1 public class DaemonThread extends Thread { 2 3 @Override 4 public void run() { 5 6 while(true){ 7 try { 8 Thread.sleep(1000); 9 System.out.println("我是线程"+Thread.currentThread().getName()+"我正在执行"); 10 } catch (Exception e) { 11 // 12 e.printStackTrace(); 13 } 14 } 15 } 16 }
很简单,在DaemonThread的run方法中先让线程休眠一秒钟,然后打印一下信息,接下来看下main中逻辑:
1 public static void main(String[] args) { 2 // 3 DaemonThread d1 = new DaemonThread(); 4 d1.setDaemon(true); 5 d1.start(); 6 7 for(int i=0;i<500;i++){ 8 System.out.println("我是线程"+Thread.currentThread().getName()+"我正在执行:"+i); 9 } 10 }
主要逻辑就是调用setDaemon方法将d1线程设置为守护线程,主线程中循环打印信息。运行打印如下信息:
1 我是线程main我正在执行:0 2 我是线程main我正在执行:1 3 我是线程main我正在执行:2 4 我是线程main我正在执行:3 5 我是线程main我正在执行:4 6 我是线程main我正在执行:5 7 我是线程main我正在执行:6 8 我是线程main我正在执行:7 9 我是线程main我正在执行:8 10 我是线程main我正在执行:9 11 我是线程main我正在执行:10.... 12 我是线程main我正在执行:96 13 我是线程main我正在执行:97 14 我是线程main我正在执行:9815 我是线程main我正在执行:99
我们看到只有主线程中信息打印,d1守护线程没有任何信息打印出,原因也很好解释了,运行程序主线程瞬间执行完毕,此时项目中没有其余线程工作,JVM也就退出了,进而d1线程也就得不到执行就被销毁了。守护线程介绍到此为止。
一、线程join()方法概述及示例
我所理解的join()的方法主要作用就是"等待"的作用,什么意思呢?比如B线程要等A线程执行完才开始执行其逻辑,那么就可以在B线程即将开始执行其逻辑的时候调用A线程的join()方法,此时就会转到A线程逻辑执行,执行完继续回来执行B线程逻辑,记住:要想join()方法起作用,A线程此时必须是alive状态(源码中有体现)。
直接看Demo吧.
JoinThread1类:很简单就是打印信息
1 public class JoinThread1 extends Thread { 2 3 @Override 4 public void run() { 5 6 try { 7 int nextInt = new Random().nextInt(5); 8 Thread.sleep(nextInt * 1000); 9 System.out.println("我是线程"+Thread.currentThread().getName()+"我睡了"+nextInt+"秒"); 10 } catch (InterruptedException e) { 11 e.printStackTrace(); 12 } 13 } 14 }
JoinThread2类:
1 public class JoinThread2 extends Thread { 2 3 private Thread mThread; 4 5 public JoinThread2(Thread mThread) { 6 super(); 7 this.mThread = mThread; 8 } 9 10 @Override 11 public void run() { 12 13 try { 14 mThread.join(); 15 int nextInt = new Random().nextInt(5); 16 Thread.sleep(nextInt * 1000);//sleep在同步的方法中是不释放对象锁的,只有同步方法执行完毕,其他线程才可以执行。 17 System.out.println("我是线程"+Thread.currentThread().getName()+"我睡了"+nextInt+"秒"); 18 19 } catch (InterruptedException e) { 20 e.printStackTrace(); 21 } 22 } 23 }
初始化的时候传进来一个mThread,在run方法执行的时候首先调用传递进来的mThread的join()方法然后在执行其逻辑。
mian方法:
1 public static void main(String[] args) { 2 // 3 try { 4 JoinThread1 join1 = new JoinThread1(); 5 join1.start(); 6 JoinThread2 join2 = new JoinThread2(join1); 7 join2.start(); 8 join2.join();//join底层是wait方法,会释放对象锁的 9 } catch (InterruptedException e) { 10 e.printStackTrace(); 11 } 12 System.out.println("我是主线程我执行完毕了"); 13 }
main方法中逻辑也很简单,主要是初始化线程并启动,但是我们调用了join2.join()方法,所以主线程就要等待join2线程执行完毕才继续往下执行,运行程序输出如下:
1 我是线程Thread-0我睡了1秒 2 我是线程Thread-1我睡了0秒 3 我是主线程我执行完毕了
如果你理解了上面说的打印信息顺序应该很容易理解。
但是如果main代码改为如下输出Log是什么样的呢:
public static void main(String[] args) {// try {JoinThread1 join1 = new JoinThread1();join1.start();JoinThread2 join2 = new JoinThread2(join1);join2.join();//join底层是wait方法,会释放对象锁的 join2.start();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("我是主线程我执行完毕了"); }
改为如下又是什么呢?
1 public static void main(String[] args) { 2 // 3 try { 4 JoinThread1 join1 = new JoinThread1(); 5 JoinThread2 join2 = new JoinThread2(join1); 6 join2.start(); 7 join2.join();//join底层是wait方法,会释放对象锁的 8 join1.start(); 9 } catch (InterruptedException e) { 10 e.printStackTrace(); 11 } 12 System.out.println("我是主线程我执行完毕了"); 13 }
如果你能全部答对那么join()方法你就基本全部理解了,知识点虽小,但是也要认真理解透!!!
本文到此为止,希望对你有帮助。
转载于:https://www.cnblogs.com/leipDao/p/8288772.html
java多线程之守护线程以及Join方法相关推荐
- JAVA多线程:守护线程 setDaemon全方位剖析| 守护线程是线程吗 |thread.isAlive()反思(五)
前言 本文目的,通过短小精悍的实例,让你在最短时间,全面揭晓 thread.setDaemon(true)守护线程的使用,及其使用场景.一看就懂,一学就会! 概述 守护线程的作用 用来让其(这里暂称之 ...
- Java多线程之守护线程实战
转载自 Java多线程之<<守护线程>>实战 定义 什么是守护线程?与守护线程相对应的就是用户线程,守护线程就是守护用户线程,当用户线程全部执行完结束之后,守护线程才会跟着结束 ...
- Java多线程之守护线程
一.说明 Java中的线程分为两类:一种是守护线程,一种是用户线程.平台我们经常用到的就是用户线程.用户线程和守护线程,从本质上来说并没有什么区别,唯一的不同之处就在于虚拟机的离开:如果用户线程已经全 ...
- java线程中join方法的简单讲解
一.作用 Thread类中的join方法的主要作用就是同步,它可以使得线程之间的并发执行变为串行执行.具体看代码: public class Test {public static void main ...
- Java多线程编程(3)--线程安全性
一.线程安全性 一般而言,如果一个类在单线程环境下能够运作正常,并且在多线程环境下,在其使用方不必为其做任何改变的情况下也能运作正常,那么我们就称其是线程安全的.反之,如果一个类在单线程环境下运作 ...
- JVM - 结合代码示例彻底搞懂Java内存区域_线程栈 | 本地方法栈 | 程序计数器
文章目录 Pre 运行时数据区总览 线程栈 概要 栈内部主要组成部分 局部变量 操作数栈 动态链接 方法出口 小结 程序计数器 本地方法栈 附 测试demo javap JVM字节码指令集手册 Pre ...
- Java多线程系列--“JUC线程池”06之 Callable和Future
转载自 Java多线程系列--"JUC线程池"06之 Callable和Future Callable 和 Future 简介 Callable 和 Future 是比较有趣的一 ...
- java有push方法么_[Java教程]js中push和join方法使用介绍
[Java教程]js中push和join方法使用介绍 0 2013-10-09 07:00:17 push和join方法想必大家并不陌生吧,在本文将为大家详细介绍下js中的push和join方法的使用 ...
- JAVE SE 学习day_09:sleep线程阻塞方法、守护线程、join协调线程同步方法、synchronized关键字解决多线程并发安全问题
一.sleep线程阻塞方法 static void sleep(long ms) Thread提供的静态方法sleep可以让运行该方法的线程阻塞指定毫秒,超时后线程会自动回到RUNNABLE状态,等待 ...
- java thread join_java中thread的join方法为什么能让线程插队
在面试中经常会遇到这样的问题:在主线程中有两个子线程,如果能让着两个子线程能顺序的执行? 答案自然是用join来使得两个线程顺序执行,先看一下具体代码 public class ThreadOfJoi ...
最新文章
- 23张图,带你入门推荐系统
- matlab unique函数
- 用Python实现一个实时运动的大挂钟效果
- asp.net学习笔记·文件上传
- js 对 URL 参数进行 加密 解密
- Zygote工作流程分析
- 机器学习——SVM之交叉验证对参数(C,gamma)进行优化以及选择
- UVALive 7455	Linear Ecosystem (高斯消元)
- Linux串口驱动分析read
- wampserver的下载与安装配置
- 软件项目建议书模板(免费)
- 思科cisco模拟器路由器的基础配置
- A品牌电动车全国营销方案
- 题目0063-射击比赛
- 全面替代Microsoft Office、Microsoft visio和WPS的优秀开源文档编辑器LibreOffice
- Android开发中WIFI和GPRS网络的切换
- java与javax有什么区别?
- 目标检测算法模型YOLOV3原理及其实战 课程简介
- 社区公共安全治理探索:达观舆情信息智能处理解决方案
- 在中国当程序员,35岁是分水岭?这些新路你知道吗?
热门文章
- 安卓自定义控件,自行绘制文字
- error: statement with no effect [-Werror=unused-value]
- lua.c:82:10: fatal error: readline/readline.h: 没有那个文件或目录
- 液晶显示器模糊的照片
- 错误一例:expected expression before } token
- 给客户寄荔枝很好,开展新业务更重要
- RuntimeError: Attempting to deserialize object on a CUDA device but torch.cuda.is_available() is Fal
- 如何正确获取安卓外置SD卡的路径
- is not allowed for source level below 1.7 的解决办法
- springboot连接mysql乱码_springboot2.x——接口访问出现中文乱码