用户线程是用户创建的一般线程,而守护线程则是为用户线程提供服务的。

任何线程都可以是守护线程或者用户线程,所有线程一开始都是用户线程。守护线程和用户线程的区别在于,当一个用户线程结束后,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线程_守护线程和用户线程相关推荐

  1. 所有java程序都有线程_若所有的用户线程都终止了,Java程序就会结束。( )_学小易找答案...

    [单选题]关于链表结构,陈述错误的是 . [单选题]下列关于构造方法的特点的描述中,错误的是 . [判断题]在构造方法中如调用 super() 语句,则必须使其成为构造方法中的第一条语句. [单选题] ...

  2. java如何模拟请求_单元测试如何模拟用户请求

    python web自动化测试设计构工具书 40.9元 包邮 (需用券) 去购买 > 错误 正当我高高兴兴写完后台c层的测试代码准备提交时,测试机器人报了很多401错误,把代码拉下来一看,原来当 ...

  3. 登录用友显示java已被阻止_解决Spring Security 用户帐号已被锁定问题

    1.问题描述 主要就是org.springframework.security.authentication.LockedException: 用户帐号已被锁定这个异常,完整异常如下: [2020-0 ...

  4. java随机数扔色子_我如何问用户是否希望使用netbeans在Java中进行每个骰子掷骰后继续游戏...

    小编典典 扫描仪可用于提示用户询问他/她是否要继续. 您甚至可以跟踪编号.掷骰子的次数. import java.util.Scanner; public class DiceGame { publi ...

  5. java守护线程和用户线程

    java守护线程和用户线程 1.Java线程分类 Java分两类线程:1.用户线程 2.守护线程 2.区别 1.JVM在用户线程没有结束前,会一直和守护线程一同运行. 2.如果用户线程全部结束,那么J ...

  6. 额!Java中用户线程和守护线程区别这么大?

    作者 | 王磊 来源 | Java中文社群(ID:javacn666) 转载请联系授权(微信ID:GG_Stone) 在 Java 语言中线程分为两类:用户线程和守护线程,而二者之间的区别却鲜有人知, ...

  7. Java并发知识梳理(上):并发优缺点,线程状态转换,Java内存模型,Synchronized,Volatile,final,并发三特性,Lock与AQS,ReetrandLock

    努力的意义,就是,在以后的日子里,放眼望去全是自己喜欢的人和事! 整个系列文章为Java并发专题,一是自己的兴趣,二是,这部分在实际理解上很有难度,另外在面试过程中也是经常被问到.所以在学习过程中,记 ...

  8. java多线程实战指南_学习笔记《Java多线程编程实战指南》二

    2.1线程属性 属性 属性类型及用途 只读属性 注意事项 编号(id) long型,标识不同线程 是 不适合用作唯一标识 名称(name) String型,区分不同线程 否 设置名称有助于代码调试和问 ...

  9. 多个线程访问统一对象的不同方法_不会多线程还想进BAT?精选19道多线程面试题,有答案边看边学...

    一. Java程序如何停止一个线程? 建议使用"异常法"来终止线程的继续运行.在想要被中断执行的线程中, 调用 interrupted()方法,该方法用来检验当前线程是否已经被中断 ...

  10. Java并发——Java与多线程

    并发处理的广泛应用是Amdahl定律代替摩尔定律成为计算机性能发展源动力的根本原因,也是人 类压榨计算机运算能力的最有力武器. 主流的操作系统都提供了线程实现,Java语言则提供了在不同硬件和操作系统 ...

最新文章

  1. Cacti 自定义脚本监控
  2. springboot获取URL请求参数的几种方法
  3. Tableau可视化分析实战系列浏览 Tableau 环境(四) -功能区和卡参考
  4. innerHTML与innerText
  5. 【超人】社区二手小程序v6.15.2+前端
  6. JBoss Tools安装
  7. 20210602:力扣第243周周赛(下)
  8. httpd的一些知识点
  9. jquery如何判断元素是否被点击_百度知道
  10. Nginx面试题(总结最全面的面试题!!!)
  11. 测试驱动开发(TDD)实践与技巧
  12. sis地址发布器_【一起练翻译-9.1】关于提词器、真实、川普和演讲
  13. JSONP实现跨域的原理
  14. log4cxx的使用
  15. 分享一个在线转码工具网站 文档音视频压缩等
  16. 使用python在已存在的excel数据表中的特定位置写入数据
  17. 推动前端团队基础设施建设流程方案计划书
  18. 深度学习领域引用量最多的前20篇论文简介
  19. 搭建一个自定义的工作流管理平台(一)
  20. Windos10使用手册

热门文章

  1. 加权最小二乘(wls)滤波算法原理及实现
  2. 软件测试行业的职业素养
  3. python内置类型详细解释
  4. spring boot全局统一异常处理
  5. 标准C程序设计七---121
  6. mysql分页优化方法
  7. 关于VOID *在cl与gcc的不同(无意中发现)
  8. JavaScript Date Format
  9. matlab实现将彩色图像(R,G,B)色分量的直方图匹配,并计算其相关性
  10. 【LeetCode】【字符串】题号:*125. 验证回文串