用户线程和守护线程

用户线程

用户线程执行完,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并发:初探用户线程和守护线程的更多相关文章

  1. 转:【Java并发编程】之四:守护线程与线程阻塞的四种情况

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/17099981      守护线程   Java中有两类线程:User Thread(用户线 ...

  2. 【Java并发编程】之四:守护线程与线程阻塞的四种情况

    守护线程 Java中有两类线程:User Thread(用户线程).Daemon Thread(守护线程) ​ 用户线程即运行在前台的线程,而守护线程是运行在后台的线程. 守护线程作用是为其他前台线程 ...

  3. java高并发系列 - 第9天:用户线程和守护线程

    守护线程是一种特殊的线程,在后台默默地完成一些系统性的服务,比如垃圾回收线程.JIT线程都是守护线程.与之对应的是用户线程,用户线程可以理解为是系统的工作线程,它会完成这个程序需要完成的业务操作.如果 ...

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

    在 Java 语言中线程分为两类:用户线程和守护线程,而二者之间的区别却鲜有人知,所以本文磊哥带你来看二者之间的区别,以及守护线程需要注意的一些事项. 1.默认用户线程 Java 语言中无论是线程还是 ...

  5. java并发编程(四)守护进程 线程阻塞的四种情况

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/17099981 守护线程   Java中有两类线程:User Thread(用户线程).Da ...

  6. Java用户线程和守护线程

    今天看Java一个关于多线程返回值方式的示例,发现一个自己不太能理解的问题,就是在主线程中启动了几个工作线程,主线程中也没有join,工作线程居然也是正常输出了回调的结果.这个跟linux C++下的 ...

  7. 【java多线程】用户线程和守护线程的区别

    java中线程分为两种类型:用户线程和守护线程.通过Thread.setDaemon(false)设置为用户线程:通过Thread.setDaemon(true)设置为守护线程.如果不设置次属性,默认 ...

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

    在Java中通常有两种线程:用户线程和守护线程(也被称为服务线程)通过Thread.setDaemon(false)设置为用户线程通过Thread.setDaemon(true)设置为守护线程线程属性 ...

  9. JAVA笔记13__创建线程/线程休眠/等待线程终止/线程中断/守护线程

    /** * 线程:是进程的一个执行路径,共享一个内存空间,线程之间可以自由切换,并发执行,一个进程最少有一个进程(单线程程序) * 多线程两种实现方法:1.继承Thread类 2.实现Runnable ...

随机推荐

  1. C语言:判断字符串是否为回文,-函数fun将单向链表结点数据域为偶数的值累加起来。-用函数指针指向要调用的函数,并进行调用。

    //函数fun功能:用函数指针指向要调用的函数,并进行调用. #include <stdio.h> double f1(double x) { return x*x; } double f ...

  2. python的组合数据

    python的组合数据包括:1.列表list[   ] 2.元组tuple(),3.字典dict{"x":"y"},4.集合set{} 1.创造组合数据:均可直 ...

  3. 《JavaScript高级程序设计》读书笔记(三)基本概念第六小节理解函数

    内容---语法---数据类型---流程控制语句 上一小节---理解函数 本小节 函数--使用function关键字声明,后跟一组参数以及函数体 function functionName(arg0, ...

  4. Java的反射机制之反向抽烟

    show me the code and take to me,做的出来更要说的明白 GitHub项目JavaHouse同步收录 喜欢就点个赞呗! 你的支持是我分享的动力! 引入 反射是一种不按套路处 ...

  5. MySQL主从复制原理的是啥?

    主库将变更写binlog日志,然后从库连接到主库之后,从库有一个IO线程,将主库的binlog日志拷贝到自己本地,写入一个中继日志中. 接着从库中有一个SQL线程会从中继日志读取binlog,然后执行 ...

  6. Druid数据源SQL数据库与Spring监控

    Druid监控概要说明 为什么要监控? Druid是什么?德鲁伊 URL监控配置说明 配置步骤 步骤 配置 第一步 web.xml 配置 WebStatFilter 第二步 WebStatFilter ...

  7. 浅谈SQL注入漏洞以及防范策略

    --HeShiwei 2014-5-15 什么是SQL注入 SQL注入,指的是用户通过向登录框输入恶意字符,利用代码的字符串拼接漏洞进行网站注入攻击,最终导致整个网站用户表信息泄露的攻击方式.黑客就是 ...

  8. 关于浮动&关于BFC规范&whyoverflow清除浮动

    https://www.cnblogs.com/smivico/p/7656270.html 浮动 https://www.jianshu.com/p/4b93eecb090e BFC https:/ ...

  9. OpenThreads库学习

    在看STM32资料中看到STM32WB系列“双核无线微控制器配备双核无线微控制器(MCU)配备Bluetooth® 5.OpenThread和ZigBee®3.0连接技术,同时兼备超低功耗性能“不知道 ...

  10. QWidget: “Must construct a QApplication before a QWidget”

    最近在做一个关于Qt的项目,在debug版本中没有任何问题,所以就想看看在Release版本下的运行情况,结果在开始运行时,出现如下图1-1所示的错误.在网上搜索答案,大多数是关于QWidget: M ...