java多线程之守护线程以及Join方法
版权声明:本文出自汪磊的博客,转载请务必注明出处。
一、守护线程概述及示例
守护线程就是为其它线程提供"守护"作用,说白了就是为其它线程服务的,比如GC线程。
java程序中线程分两种:用户线程与守护线程,用户线程就是我们平常编写的一个个子线程,比如负责下载的线程,上传数据的线程等。如果一个线程调用了setDaemon(true)方法则变成了守护线程,两种线程本质上没什么区别,但是当一个工程中所有用户线程都执行完了,那么守护线程就没什么服务对象了,此时虚拟机退出,守护线程被销毁。
下面通过一个小Demo示例。编写DaemonThread类,如下:
public class DaemonThread extends Thread { @Override
public void run() { while(true){
try {
Thread.sleep(1000);
System.out.println("我是线程"+Thread.currentThread().getName()+"我正在执行");
} catch (Exception e) {
//
e.printStackTrace();
}
}
}
}
很简单,在DaemonThread的run方法中先让线程休眠一秒钟,然后打印一下信息,接下来看下main中逻辑:
public static void main(String[] args) {
//
DaemonThread d1 = new DaemonThread();
d1.setDaemon(true);
d1.start(); for(int i=0;i<500;i++){
System.out.println("我是线程"+Thread.currentThread().getName()+"我正在执行:"+i);
}
}
主要逻辑就是调用setDaemon方法将d1线程设置为守护线程,主线程中循环打印信息。运行打印如下信息:
我是线程main我正在执行:0
我是线程main我正在执行:1
我是线程main我正在执行:2
我是线程main我正在执行:3
我是线程main我正在执行:4
我是线程main我正在执行:5
我是线程main我正在执行:6
我是线程main我正在执行:7
我是线程main我正在执行:8
我是线程main我正在执行:9
我是线程main我正在执行:10
....
我是线程main我正在执行:96
我是线程main我正在执行:97
我是线程main我正在执行:98
我是线程main我正在执行:99
我们看到只有主线程中信息打印,d1守护线程没有任何信息打印出,原因也很好解释了,运行程序主线程瞬间执行完毕,此时项目中没有其余线程工作,JVM也就退出了,进而d1线程也就得不到执行就被销毁了。守护线程介绍到此为止。
一、线程join()方法概述及示例
我所理解的join()的方法主要作用就是"等待"的作用,什么意思呢?比如B线程要等A线程执行完才开始执行其逻辑,那么就可以在B线程即将开始执行其逻辑的时候调用A线程的join()方法,此时就会转到A线程逻辑执行,执行完继续回来执行B线程逻辑,记住:要想join()方法起作用,A线程此时必须是alive状态(源码中有体现)。
直接看Demo吧.
JoinThread1类:很简单就是打印信息
public class JoinThread1 extends Thread { @Override
public void run() { try {
int nextInt = new Random().nextInt(5);
Thread.sleep(nextInt * 1000);
System.out.println("我是线程"+Thread.currentThread().getName()+"我睡了"+nextInt+"秒");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
JoinThread2类:
public class JoinThread2 extends Thread { private Thread mThread; public JoinThread2(Thread mThread) {
super();
this.mThread = mThread;
} @Override
public void run() { try {
mThread.join();
int nextInt = new Random().nextInt(5);
Thread.sleep(nextInt * 1000);//sleep在同步的方法中是不释放对象锁的,只有同步方法执行完毕,其他线程才可以执行。
System.out.println("我是线程"+Thread.currentThread().getName()+"我睡了"+nextInt+"秒"); } catch (InterruptedException e) {
e.printStackTrace();
}
}
}
初始化的时候传进来一个mThread,在run方法执行的时候首先调用传递进来的mThread的join()方法然后在执行其逻辑。
mian方法:
public static void main(String[] args) {
//
try {
JoinThread1 join1 = new JoinThread1();
join1.start();
JoinThread2 join2 = new JoinThread2(join1);
join2.start();
join2.join();//join底层是wait方法,会释放对象锁的
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("我是主线程我执行完毕了");
}
main方法中逻辑也很简单,主要是初始化线程并启动,但是我们调用了join2.join()方法,所以主线程就要等待join2线程执行完毕才继续往下执行,运行程序输出如下:
我是线程Thread-0我睡了1秒
我是线程Thread-1我睡了0秒
我是主线程我执行完毕了
如果你理解了上面说的打印信息顺序应该很容易理解。
但是如果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("我是主线程我执行完毕了");
}
改为如下又是什么呢?
public static void main(String[] args) {
//
try {
JoinThread1 join1 = new JoinThread1();
JoinThread2 join2 = new JoinThread2(join1);
join2.start();
join2.join();//join底层是wait方法,会释放对象锁的
join1.start();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("我是主线程我执行完毕了");
}
如果你能全部答对那么join()方法你就基本全部理解了,知识点虽小,但是也要认真理解透!!!
本文到此为止,希望对你有帮助。
java多线程之守护线程以及Join方法的更多相关文章
- Java多线程之守护线程
Java多线程之守护线程 一.前言 Java线程有两类: 用户线程:运行在前台,执行具体的任务,程序的主线程,连接网络的子线程等都是用户线程 守护线程:运行在后台,为其他前台线程服务 特点:一旦所有用 ...
- Java 多线程基础(九)join() 方法
Java 多线程基础(九)join 方法 一.join() 方法介绍 join() 定义 Thread 类中的,作用是:把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程.如:线 ...
- 多线程---其他方法 停止线程、守护线程、join方法
第三方停止线程: 原来是stop(),因为该方法有些问题,所以被interrupt()方法取代,它的用途跟机制是 当没有指定的方式让冻结的线程恢复到运行状态时,这时需要对冻结进行清除,强制让线程恢复到 ...
- java多线程之守护线程与非守护线程
在java线程中有两种线程,一种是用户线程,其余一种是守护线程. 守护线程具有特殊的含义,比如gc线程.当最后一个非守护线程执行完后,守护线程随着jvm一同结束工作. java中的守护线程需要将Dae ...
- Java多线程(2):线程加入/join()
线程加入 join()方法,等待其他线程终止.在当前线程(主线程)中调用另一个线程(子线程)的join()方法,则当前线程转入阻塞状态,直到另一个线程运行结束,当前线程再由阻塞转为就绪状态. 也就是主 ...
- Java中的后台线程和join方法
/*守护线程(后台线程):在一个进程中如果只剩下 了守护线程,那么守护线程也会死亡. 需求: 模拟QQ下载更新包. 一个线程默认都不是守护线程. */ public class Demo extend ...
- 43. 守护线程 和 join方法
1.守护线程(后台线程): 我们在使用一款软件的时候,有的软件会让我们在不知道的情况下下载一些东西,那么这个就是后台线程. 一般用于提高软件的下载量(也就是 ...
- java多线程之守护线程(Daemon)
https://blog.csdn.net/u010739551/article/details/51065923/
- 015.4守护线程和join
内容:守护线程.join方法#####################守护线程通过开启线程之前调用setDaemon()方法,变成后台线程,前台线程运行完,后台线程自动会结束#########例子 c ...
随机推荐
- Linux定时器工具-crontab 各參数具体解释及怎样查看日志记录
要使用crontab定时器工具,必需要启动cron服务: service cron start crontab的语法,以备日后救急.先上张超给力的图: crontab各參数说明: -e : 运行文字编 ...
- ABP入门系列(9)——权限管理
ABP入门系列目录--学习Abp框架之实操演练 源码路径:Github-LearningMpaAbp 完成了简单的增删改查和分页功能,是不是觉得少了点什么? 是的,少了权限管理.既然涉及到了权限,那我 ...
- CentOS 6.5 安装MySQL过程
使用软件的版本 CentOS 6.5 mysql-5.5.22.tar.gz cmake-2.8.6.tar.gz 准备工作 解压安装mysql之前把关于mysql软件包卸载,以免程序冲突,端口冲突. ...
- (转)JVM工作原理和流程
作为一名Java使用者,掌握JVM的体系结构也是必须的. 说起Java,人们首先想到的是Java编程语言,然而事实上,Java是一种技术,它由四方面组成:Java编程语言.Java类文件格式.Java ...
- 自学Zabbix3.8-可视化Visualisation
随着大量数据流入Zabbix,如果用户能够查看正在发生的事情,而不仅仅是数字,那么对于用户来说,这就变得容易得多了.这就是图的所在. 图允许快速地掌握数据流,关联问题,发现什么时候开始,或者做什么事情 ...
- iOS手机截屏使用
.截屏 保存 .data //登录成功进行截屏 //截取屏幕大小 UIGraphicsBeginImageContext([[UIScreen mainScreen]bounds].size); [s ...
- 用过的关于css的知识
1.代码片段 让两个div并排起来显示. <div style="width:1000px; text-align:center;" id="content&quo ...
- 百度云BCC配置Apache VirtualHost 实现相同域名不同端口访问不同应用
问题描述:前戏:本人在百度云上购买了BCC虚拟服务,并购买域名,部署应用,可以正常访问(这里一切都很正常^_^). 事情正在起变化:随着开发的不断推进,工程在本地测试成功后,部署到服务器,会发现有些页 ...
- mysql5.7-Group Replication
什么是Group Replication 基于组的复制(Group-based Replication)是一种被使用在容错系统中的技术.Replication-group(复制组)是由能够相互通信的多 ...
- bzoj 1835: [ZJOI2010]base 基站选址
Description 有N个村庄坐落在一条直线上,第i(i>1)个村庄距离第1个村庄的距离为Di.需要在这些村庄中建立不超过K个通讯基站,在第i个村庄建立基站的费用为Ci.如果在距离第i个村庄 ...