ThreadFactory
2024-09-05 02:08:02
在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;
}
}
最新文章
- Android数据存储之Sqlite的介绍及使用
- CentOS6.7安装Python3.4
- PHP的变量
- [ 转载 ] kernel32.BaseThreadInitThunk
- redis的主从复制,读写分离,主从切换
- STORM_0004_windows下zookeeper的伪集群的搭建
- 二叉查找树(BST)
- css案例学习之div ul li a 实现导航效果
- codeforces 626E. Simple Skewness 三分
- wikioi 1034 家 实时动态的网络流量(费用流)
- 学习总结------用JDBC连接MySQL
- 微信小程序之页面路由
- linux FTP安全配置
- Failed to set MokListRT: Invalid Parameter Something as gone seriously wrong: import_mok_state() failed: Invalid Parameter
- 关于MySQL5.7 这几天的总结(json类型)
- VBA读写ini 配置文件
- html4
- SpringMVC(十一) RequestMapping获取Cookie值
- (原)Max Area of Island(即连通域标记)
- js跳转新窗口
热门文章
- cross validation
- 使用metasploit进行栈溢出攻击-2
- “网易大数据讲堂第一期:数说”直播活动资料:课程回放收看及PPT下载
- 正经学C#_判断[IF语句]:[c#入门经典]
- hadoop下HDFS基本命令使用
- How to compile a node file?如何编译一个节点文件?
- xshell学习笔记
- bzoj3684: 大朋友和多叉树(拉格朗日反演+多项式全家桶)
- VS2010 简单ATL COM开发
- POJ 3734 Blocks(矩阵快速幂+矩阵递推式)