java并发:初探用户线程和守护线程
用户线程和守护线程
用户线程
用户线程执行完,jvm退出。守护线程还是可以跑的
/**
* A <i>thread</i> is a thread of execution in a program. The Java
* Virtual Machine allows an application to have multiple threads of
* execution running concurrently.
* <p>
* Every thread has a priority. Threads with higher priority are
* executed in preference to threads with lower priority. Each thread
* may or may not also be marked as a daemon. When code running in
* some thread creates a new <code>Thread</code> object, the new
* thread has its priority initially set equal to the priority of the
* creating thread, and is a daemon thread if and only if the
* creating thread is a daemon.
* <p>
* When a Java Virtual Machine starts up, there is usually a single
* non-daemon thread (which typically calls the method named
* <code>main</code> of some designated class). The Java Virtual
* Machine continues to execute threads until either of the following
* occurs:
* <ul>
* <li>The <code>exit</code> method of class <code>Runtime</code> has been
* called and the security manager has permitted the exit operation
* to take place.
* <li>All threads that are not daemon threads have died, either by
* returning from the call to the <code>run</code> method or by
* throwing an exception that propagates beyond the <code>run</code>
* method.
* </ul>
* /
用户线程优先权
例子
package com.java.javabase.thread.base;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class PriorityTest {
private static int size =10;
public static void main(String[] args) {
Thread t1 =new ThreadOne("t1");
Thread t2 =new ThreadOne("t2");
t2.setPriority(1);
t1.start();
t2.start();
log.info("Thread {} prority is {}",Thread.currentThread().getName(),Thread.currentThread().getPriority());
}
static class ThreadOne extends Thread{
public ThreadOne(String name){
super(name);
}
@Override
public void run(){
int i =0;
while(i<size){
log.info("Thread : {} priority is {} ,run {} times",Thread.currentThread().getName(),
Thread.currentThread().getPriority(),i++);
}
}
}
}
说明
setPriority是Thread方法,用户线程的优先级是1到10,默认是5。虽然设置了优先级,但线程的执行还是在于获取cpu的执行,看操作系统的支持,
不是你级别高,cpu就给你用的。
守护线程
package com.java.javabase.thread.base;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class DaemonTest {
private static int size =10;
public static void main(String[] args) {
Thread t1 =new ThreadOne("t1");
Thread t2 =new ThreadTwo("t2");
t2.setDaemon(true);
t1.start();
t2.start();
log.info("Thread {} prority is {}",Thread.currentThread().getName(),Thread.currentThread().getPriority());
}
static class ThreadOne extends Thread{
public ThreadOne(String name){
super(name);
}
@Override
public void run(){
int i =0;
while(i<size){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
log.info("Thread : {} priority is {} ,run {} times",Thread.currentThread().getName(),
Thread.currentThread().getPriority(),i++);
}
}
}
static class ThreadTwo extends Thread{
public ThreadTwo(String name){
super(name);
}
@Override
public void run(){
int i =0;
while(true&& i<(size*10000)){
try {
Thread.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
log.info("Thread : {} priority is {} ,run {} times",Thread.currentThread().getName(),
Thread.currentThread().getPriority(),i++);
}
}
}
}
测试结果
2019-07-30 20:49:51,963 [main] INFO DaemonTest - Thread main prority is 5
2019-07-30 20:49:51,970 [t1] INFO DaemonTest - Thread : t1 priority is 5 ,run 0 times
2019-07-30 20:49:51,980 [t1] INFO DaemonTest - Thread : t1 priority is 5 ,run 1 times
2019-07-30 20:49:51,980 [t2] INFO DaemonTest - Thread : t2 priority is 5 ,run 0 times
2019-07-30 20:49:51,991 [t1] INFO DaemonTest - Thread : t1 priority is 5 ,run 2 times
2019-07-30 20:49:52,001 [t2] INFO DaemonTest - Thread : t2 priority is 5 ,run 1 times
2019-07-30 20:49:52,002 [t1] INFO DaemonTest - Thread : t1 priority is 5 ,run 3 times
2019-07-30 20:49:52,013 [t1] INFO DaemonTest - Thread : t1 priority is 5 ,run 4 times
2019-07-30 20:49:52,021 [t2] INFO DaemonTest - Thread : t2 priority is 5 ,run 2 times
2019-07-30 20:49:52,023 [t1] INFO DaemonTest - Thread : t1 priority is 5 ,run 5 times
2019-07-30 20:49:52,034 [t1] INFO DaemonTest - Thread : t1 priority is 5 ,run 6 times
2019-07-30 20:49:52,042 [t2] INFO DaemonTest - Thread : t2 priority is 5 ,run 3 times
2019-07-30 20:49:52,045 [t1] INFO DaemonTest - Thread : t1 priority is 5 ,run 7 times
2019-07-30 20:49:52,056 [t1] INFO DaemonTest - Thread : t1 priority is 5 ,run 8 times
2019-07-30 20:49:52,062 [t2] INFO DaemonTest - Thread : t2 priority is 5 ,run 4 times
2019-07-30 20:49:52,066 [t1] INFO DaemonTest - Thread : t1 priority is 5 ,run 9 times
java并发:初探用户线程和守护线程的更多相关文章
- 转:【Java并发编程】之四:守护线程与线程阻塞的四种情况
转载请注明出处:http://blog.csdn.net/ns_code/article/details/17099981 守护线程 Java中有两类线程:User Thread(用户线 ...
- 【Java并发编程】之四:守护线程与线程阻塞的四种情况
守护线程 Java中有两类线程:User Thread(用户线程).Daemon Thread(守护线程) 用户线程即运行在前台的线程,而守护线程是运行在后台的线程. 守护线程作用是为其他前台线程 ...
- java高并发系列 - 第9天:用户线程和守护线程
守护线程是一种特殊的线程,在后台默默地完成一些系统性的服务,比如垃圾回收线程.JIT线程都是守护线程.与之对应的是用户线程,用户线程可以理解为是系统的工作线程,它会完成这个程序需要完成的业务操作.如果 ...
- 额!Java中用户线程和守护线程区别这么大?
在 Java 语言中线程分为两类:用户线程和守护线程,而二者之间的区别却鲜有人知,所以本文磊哥带你来看二者之间的区别,以及守护线程需要注意的一些事项. 1.默认用户线程 Java 语言中无论是线程还是 ...
- java并发编程(四)守护进程 线程阻塞的四种情况
转载请注明出处:http://blog.csdn.net/ns_code/article/details/17099981 守护线程 Java中有两类线程:User Thread(用户线程).Da ...
- Java用户线程和守护线程
今天看Java一个关于多线程返回值方式的示例,发现一个自己不太能理解的问题,就是在主线程中启动了几个工作线程,主线程中也没有join,工作线程居然也是正常输出了回调的结果.这个跟linux C++下的 ...
- 【java多线程】用户线程和守护线程的区别
java中线程分为两种类型:用户线程和守护线程.通过Thread.setDaemon(false)设置为用户线程:通过Thread.setDaemon(true)设置为守护线程.如果不设置次属性,默认 ...
- java 用户线程和守护线程
在Java中通常有两种线程:用户线程和守护线程(也被称为服务线程)通过Thread.setDaemon(false)设置为用户线程通过Thread.setDaemon(true)设置为守护线程线程属性 ...
- JAVA笔记13__创建线程/线程休眠/等待线程终止/线程中断/守护线程
/** * 线程:是进程的一个执行路径,共享一个内存空间,线程之间可以自由切换,并发执行,一个进程最少有一个进程(单线程程序) * 多线程两种实现方法:1.继承Thread类 2.实现Runnable ...
随机推荐
- 关于overflow:hidden的作用(溢出隐藏,清除浮动,解决外边塌陷等等)
1.overflow:hidden 溢出隐藏 给一个元素中设置overflow:hidden ,那么该元素的内容若超出了给定的宽度和高度属性,那么超出的部分将会被隐藏,不占位. 代码如下: 运行结果 ...
- Django 删除 migrations
如果想重新创建表格,可以按如下步骤进行操作: 1. 从数据库中删除表格 DROP TABLE `table_name`; 2. 删除 migrations 文件 文件在APP名称下的 migratio ...
- 缓存验证Last-Modified和Etag的使用
缓存工作示意图: 在http协议里面,数据的验证方式,主要有两个验证头:Last-Modified 和 Etag. Last-Modified 配合Last-Modified-Since或者If-Un ...
- Java JDBC 数据库链接小结随笔
Java JDBC 数据库链接小结随笔 一.链接数据库的步骤 二.关于Statement 和 PrepareStatement 两者区别 用法 三.关于 ResultSet 的一些小结 四.自定义 ...
- hbase(待完善)
1. 应用 <1> hbase解决海量图片存储 <2>
- java_1:为什么我一搞PHP的要转JAVA
为什么我一搞PHP的要高JAVA? 没什么!就他妈逼的看不惯搞JAVA那群逼鄙视PHPer的样!你会JAVA,稍微发功老子一样搞!
- 【PAT甲级】1053 Path of Equal Weight (30 分)(DFS)
题意: 输入三个正整数N,M,S(N<=100,M<N,S<=2^30)分别代表数的结点个数,非叶子结点个数和需要查询的值,接下来输入N个正整数(<1000)代表每个结点的权重 ...
- nodejs的forEach不支持break打断
- 1.ORM介绍,基本配置及通过ORM框架创建表
1.介绍 ORM全拼Object-Relation Mapping(对象-关系映射) 作用:主要实现模型对象到关系数据库数据的映射 通过ORM框架作为一个中间者或者是一个桥梁,开发者通过定义模型类,属 ...
- 19年读100本书之第二本--《OKR工作法》-克里斯蒂娜 沃特克
0,一句话概括书的内容? OKR(objective key result),即目标与关键结果. 1,我从这本书能得到什么? 2,核心内容是什么? 3,我要怎么做?