在Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程)

比如,任何一个守护线程都是整个JVM中所有非守护线程的保姆:只要当前JVM实例中尚存在任何一个非守护线程没有结束,守护线程就全部工作;只有当最后一个非守护线程结束时,守护线程随着JVM一同结束工作。

Daemon的作用是为其他线程的运行提供便利服务,守护线程最典型的应用就是 GC (垃圾回收器),它就是一个很称职的守护者。
User和Daemon两者几乎没有区别

唯一的不同之处就在于虚拟机的离开:如果 User Thread已经全部退出运行了,只剩下Daemon Thread存在了,虚拟机也就退出了。 因为没有了被守护者,Daemon也就没有工作可做了,也就没有继续运行程序的必要了。

注意:

(1) thread.setDaemon(true)必须在thread.start()之前设置,否则会跑出一个IllegalThreadStateException异常。你不能把正在运行的常规线程设置为守护线程。
(2) 在Daemon线程中产生的新线程也是Daemon的。 
(3) 不要认为所有的应用都可以分配给Daemon来进行服务,比如读写操作或者计算逻辑。

package com.huiqu.rpc.core;

import java.util.concurrent.ThreadFactory;
import java.util.concurrent.atomic.AtomicInteger; public class NamedThreadFactory implements ThreadFactory { private static final AtomicInteger threadNumber = new AtomicInteger(1);
private final AtomicInteger mThreadNum = new AtomicInteger(1);
private final String prefix;
private final boolean daemoThread;
private final ThreadGroup threadGroup; public NamedThreadFactory() {
this("rpcserver-threadpool-" + threadNumber.getAndIncrement(), false);
} public NamedThreadFactory(String prefix) {
this(prefix, false);
} public NamedThreadFactory(String prefix, boolean daemo) {
this.prefix = prefix + "-thread-";
daemoThread = daemo;
//当运行未知的Java程序的时候,该程序可能有恶意代码(删除系统文件、重启系统等),为了防止运行恶意代码对系统产生影响,
//需要对运行的代码的权限进行控制,这时候就要启用Java安全管理器。
SecurityManager s = System.getSecurityManager();
threadGroup = (s == null) ? Thread.currentThread().getThreadGroup() : s.getThreadGroup();
} public Thread newThread(Runnable runnable) {
String name = prefix + mThreadNum.getAndIncrement();
Thread ret = new Thread(threadGroup, runnable, name, 0);
ret.setDaemon(daemoThread);
return ret;
} public ThreadGroup getThreadGroup() {
return threadGroup;
}
}

最新文章

  1. Android数据存储之Sqlite的介绍及使用
  2. CentOS6.7安装Python3.4
  3. PHP的变量
  4. [ 转载 ] kernel32.BaseThreadInitThunk
  5. redis的主从复制,读写分离,主从切换
  6. STORM_0004_windows下zookeeper的伪集群的搭建
  7. 二叉查找树(BST)
  8. css案例学习之div ul li a 实现导航效果
  9. codeforces 626E. Simple Skewness 三分
  10. wikioi 1034 家 实时动态的网络流量(费用流)
  11. 学习总结------用JDBC连接MySQL
  12. 微信小程序之页面路由
  13. linux FTP安全配置
  14. Failed to set MokListRT: Invalid Parameter Something as gone seriously wrong: import_mok_state() failed: Invalid Parameter
  15. 关于MySQL5.7 这几天的总结(json类型)
  16. VBA读写ini 配置文件
  17. html4
  18. SpringMVC(十一) RequestMapping获取Cookie值
  19. (原)Max Area of Island(即连通域标记)
  20. js跳转新窗口

热门文章

  1. cross validation
  2. 使用metasploit进行栈溢出攻击-2
  3. “网易大数据讲堂第一期:数说”直播活动资料:课程回放收看及PPT下载
  4. 正经学C#_判断[IF语句]:[c#入门经典]
  5. hadoop下HDFS基本命令使用
  6. How to compile a node file?如何编译一个节点文件?
  7. xshell学习笔记
  8. bzoj3684: 大朋友和多叉树(拉格朗日反演+多项式全家桶)
  9. VS2010 简单ATL COM开发
  10. POJ 3734 Blocks(矩阵快速幂+矩阵递推式)