线程 daemon java user,Java线程_守护线程和用户线程
用户线程是用户创建的一般线程,而守护线程则是为用户线程提供服务的。
任何线程都可以是守护线程或者用户线程,所有线程一开始都是用户线程。守护线程和用户线程的区别在于,当一个用户线程结束后,Java虚拟机会检查系统中是否还存在其他用户线程,如果存在则按照正常的调用方法调用。但是如果只剩守护线程而没有用户线程的话,程序就会终止。Java中最典型的守护线程就是垃圾收集线程,垃圾收集线程负责回收程序中没用的内存空间。当程序中的其他用户线程终止以后,垃圾回收线程也就没有存在的意义了。
涉及守护线程的方法有两个:setDaemon()和isDaemon()。需要注意的是:setDaemon()方法仅仅在线程对象已经被创建但是还没有运行前才能被调用,否则会报错。
守护线程的使用:
package com.wly.javathread.chap6;
/**
* 测试守护线程用法一
* @author wly
*
*/
public class TestDaemonThread1 {
public static void main(String[] args) {
MyUserThread userThread = new MyUserThread();
MyDaemonThread daemonThread = new MyDaemonThread(userThread);
userThread.start();
daemonThread.start();
}
/**
* 守护线程
* @author wly
*
*/
static class MyDaemonThread extends Thread {
private MyUserThread userThread;
public MyDaemonThread(MyUserThread userThread) {
this.userThread = userThread;
//设置为守护线程
setDaemon(true);
}
@Override
public void run() {
super.run();
while(true) {
try {
sleep(700);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("--守护--:" + userThread.getI());
}
}
}
/**
* 用户线程
* @author wly
*
*/
static class MyUserThread extends Thread {
int i = 0;
public int getI() {
return i;
}
@Override
public void run() {
super.run();
while(i < 10) {
System.out.println("--用户--:" + getI());
i ++;
try {
sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
运行结果:
--用户--:0
--用户--:1
--用户--:2
--用户--:3
--用户--:4
--用户--:5
--用户--:6
--守护--:7
--用户--:7
--用户--:8
--用户--:9
从上面的运行结果可以看出,在所有用户线程运行完成后,程序将直接终止,以至于守护线程也会随着程序的终止而终止。
有时守护线程中进行着某想关键性操作,必须保证操作的完整性。如:数据备份到数据库动作。此时需要守护线程与用户线程嵌套锁定来使用,或者说可以通过一个用户线程来保护守护线程。听上去可能有点别扭,用一个用户线程来保护一个守护线程?还是直接看代码吧:
保护含关键性操作的守护线程:
package com.wly.javathread.chap6;
/**
* 测试守护线程用法一
* @author wly
*
*/
public class TestDaemonThread2 {
public static void main(String[] args) {
MyUserThread userThread = new MyUserThread();
userThread.start();
MyDaemonThread daemonThread = new MyDaemonThread(userThread);
daemonThread.start();
}
/**
* 守护线程
* @author wly
*
*/
static class MyDaemonThread extends Thread {
private MyUserThread userThread;
private MyLockThread lockThread;
public MyDaemonThread(MyUserThread userThread) {
setDaemon(true);
this.userThread = userThread;
lockThread = new MyLockThread();
lockThread.start();
}
@Override
public void run() {
super.run();
while(userThread.isAlive()) {
try {
sleep(700);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("--守护--:" + userThread.getI());
}
lockThread.releaseWiatThread();
}
}
/**
* 自定义用户线程
* @author wly
*
*/
static class MyUserThread extends Thread {
int i = 0;
public int getI() {
return i;
}
@Override
public void run() {
super.run();
while(i < 10) {
System.out.println("--用户--:" + getI());
i ++;
try {
sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
/**
* 一个专门用于保护"守护线程"的线程类,重写了run()方法
* @author wly
*
*/
static class MyLockThread extends Thread {
@Override
public synchronized void run() {
super.run();
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public synchronized void releaseWiatThread() {
notify();
}
}
}
运行结果:
--用户--:0
--用户--:1
--用户--:2
--用户--:3
--用户--:4
--用户--:5
--用户--:6
--用户--:7
--守护--:7
--用户--:8
--用户--:9
--守护--:10
从上面运行结果可以看出,使用了一个临时的用户线程LockThread来保护守护线程,可以在负责计算的线程MyUserThread结束后,守护线程MyDaemonThread仍然完整的执行完了其打印任务。
O啦~~~
转载请保留出处:http://blog.csdn.net/u011638883/article/details/18447361
谢谢!!
线程 daemon java user,Java线程_守护线程和用户线程相关推荐
- 所有java程序都有线程_若所有的用户线程都终止了,Java程序就会结束。( )_学小易找答案...
[单选题]关于链表结构,陈述错误的是 . [单选题]下列关于构造方法的特点的描述中,错误的是 . [判断题]在构造方法中如调用 super() 语句,则必须使其成为构造方法中的第一条语句. [单选题] ...
- java如何模拟请求_单元测试如何模拟用户请求
python web自动化测试设计构工具书 40.9元 包邮 (需用券) 去购买 > 错误 正当我高高兴兴写完后台c层的测试代码准备提交时,测试机器人报了很多401错误,把代码拉下来一看,原来当 ...
- 登录用友显示java已被阻止_解决Spring Security 用户帐号已被锁定问题
1.问题描述 主要就是org.springframework.security.authentication.LockedException: 用户帐号已被锁定这个异常,完整异常如下: [2020-0 ...
- java随机数扔色子_我如何问用户是否希望使用netbeans在Java中进行每个骰子掷骰后继续游戏...
小编典典 扫描仪可用于提示用户询问他/她是否要继续. 您甚至可以跟踪编号.掷骰子的次数. import java.util.Scanner; public class DiceGame { publi ...
- java守护线程和用户线程
java守护线程和用户线程 1.Java线程分类 Java分两类线程:1.用户线程 2.守护线程 2.区别 1.JVM在用户线程没有结束前,会一直和守护线程一同运行. 2.如果用户线程全部结束,那么J ...
- 额!Java中用户线程和守护线程区别这么大?
作者 | 王磊 来源 | Java中文社群(ID:javacn666) 转载请联系授权(微信ID:GG_Stone) 在 Java 语言中线程分为两类:用户线程和守护线程,而二者之间的区别却鲜有人知, ...
- Java并发知识梳理(上):并发优缺点,线程状态转换,Java内存模型,Synchronized,Volatile,final,并发三特性,Lock与AQS,ReetrandLock
努力的意义,就是,在以后的日子里,放眼望去全是自己喜欢的人和事! 整个系列文章为Java并发专题,一是自己的兴趣,二是,这部分在实际理解上很有难度,另外在面试过程中也是经常被问到.所以在学习过程中,记 ...
- java多线程实战指南_学习笔记《Java多线程编程实战指南》二
2.1线程属性 属性 属性类型及用途 只读属性 注意事项 编号(id) long型,标识不同线程 是 不适合用作唯一标识 名称(name) String型,区分不同线程 否 设置名称有助于代码调试和问 ...
- 多个线程访问统一对象的不同方法_不会多线程还想进BAT?精选19道多线程面试题,有答案边看边学...
一. Java程序如何停止一个线程? 建议使用"异常法"来终止线程的继续运行.在想要被中断执行的线程中, 调用 interrupted()方法,该方法用来检验当前线程是否已经被中断 ...
- Java并发——Java与多线程
并发处理的广泛应用是Amdahl定律代替摩尔定律成为计算机性能发展源动力的根本原因,也是人 类压榨计算机运算能力的最有力武器. 主流的操作系统都提供了线程实现,Java语言则提供了在不同硬件和操作系统 ...
最新文章
- Cacti 自定义脚本监控
- springboot获取URL请求参数的几种方法
- Tableau可视化分析实战系列浏览 Tableau 环境(四) -功能区和卡参考
- innerHTML与innerText
- 【超人】社区二手小程序v6.15.2+前端
- JBoss Tools安装
- 20210602:力扣第243周周赛(下)
- httpd的一些知识点
- jquery如何判断元素是否被点击_百度知道
- Nginx面试题(总结最全面的面试题!!!)
- 测试驱动开发(TDD)实践与技巧
- sis地址发布器_【一起练翻译-9.1】关于提词器、真实、川普和演讲
- JSONP实现跨域的原理
- log4cxx的使用
- 分享一个在线转码工具网站 文档音视频压缩等
- 使用python在已存在的excel数据表中的特定位置写入数据
- 推动前端团队基础设施建设流程方案计划书
- 深度学习领域引用量最多的前20篇论文简介
- 搭建一个自定义的工作流管理平台(一)
- Windos10使用手册