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

原文地址:https://www.cnblogs.com/JuncaiF/p/11272697.html

时间: 2024-10-11 10:18:51

java并发:初探用户线程和守护线程的相关文章

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

守护线程   Java中有两类线程:User Thread(用户线程).Daemon Thread(守护线程) 用户线程即运行在前台的线程,而守护线程是运行在后台的线程. 守护线程作用是为其他前台线程的运行提供便利服务,而且仅在普通.非守护线程仍然运行时才需要,比如垃圾回收线程就是一个守护线程.当VM检测仅剩一个守护线程,而用户线程都已经退出运行时,VM就会退出,因为没有如果没有了被守护这,也就没有继续运行程序的必要了.如果有非守护线程仍然存活,VM就不会退出. 守护线程并非只有虚拟机内部提供,

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

转载请注明出处:http://blog.csdn.net/ns_code/article/details/17099981      守护线程   Java中有两类线程:User Thread(用户线程).Daemon Thread(守护线程) 用户线程即运行在前台的线程,而守护线程是运行在后台的线程. 守护线程作用是为其他前台线程的运行提供便利服务,而且仅在普通.非守护线程仍然运行时才需要,比如垃圾回收线程就是一个守护线程.当VM检测仅剩一个守护线程,而用户线程都已经退出运行时,VM就会退出,

Java用户线程和守护线程

1.用户线程和守护线程的区别用户线程和守护线程都是线程,区别是Java虚拟机在所有用户线程dead后,程序就会结束.而不管是否还有守护线程还在运行,若守护线程还在运行,则会马上结束.很好理解,守护线程是用来辅助用户线程的,如公司的保安和员工,各司其职,当员工都离开后,保安自然下班了. 2.用户线程和守护线程的适用场景由两者的区别及dead时间点可知,守护线程不适合用于输入输出或计算等操作,因为用户线程执行完毕,程序就dead了,适用于辅助用户线程的场景,如JVM的垃圾回收,内存管理都是守护线程,

java 用户线程和守护线程

在Java中通常有两种线程:用户线程和守护线程(也被称为服务线程)通过Thread.setDaemon(false)设置为用户线程通过Thread.setDaemon(true)设置为守护线程线程属性的设置要在线程启动之前,否则会报IllegalThreadStateException异常如果不设置线程属性,那么默认为用户线程 用户线程和守护线程的区别: 1.主线程结束后用户线程还会继续运行,JVM存活 2.如果没有用户线程,都是守护线程,那么JVM结束(所有的线程都会结束) 守护进程(Daem

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

/** * 线程:是进程的一个执行路径,共享一个内存空间,线程之间可以自由切换,并发执行,一个进程最少有一个进程(单线程程序) * 多线程两种实现方法:1.继承Thread类 2.实现Runnable接口 */ public class Main { public static void main(String[] args) { MyThread t1 = new MyThread(); t1.start(); //启动线程 System.out.println("main"); S

Java:多线程&lt;四&gt; Lock、停止线程、守护线程、join、优先级&amp;yield

Java1.5以后,Condition将Object监视器方法(wait, notify, notifyAll)分解成截然不同的对象,以便通过这些对象与任意Lock实现组合使用为每个对像提供多个等待set(wait-set).期中,Lock替代了synchronized方法和语句的使用,Condition替代了Objetc监视器方法和使用. 当线程处于冻结状态,就有可能线程就不会结束,interrupt用于清除线程的冻结状态.当没有指定的方式让冻结状态的线程恢复到运行状态时,这是需要对冻结状态进

001-多线程基础-进程线程、线程状态、优先级、用户线程和守护线程

一.进程与线程 1.DOS系统[单进程系统] 最早的时候DOS有一个特点:只要电脑有病毒,那么电脑就死机了. 原因:传统的DOS系统属于单进程系统,即:在同一时间段内只允许有一个程序运行. 2.Windows系统[多进程多线程] 电脑中毒也可以运行,但是会变慢 原因:因为在一个cpu.一块资源的情况下,程序利用一些轮转算法,可以让一个资源在一个时间段可以同时处理多个程序(进程),但是在一个时间点上只允许一个进程去执行. windows:任务管理器 linux:ps 在每一个进程上可以划分出若干个

用户线程和守护线程

在Java中有两类线程:用户线程 (User Thread).守护线程 (Daemon Thread). 所谓守护 线程,是指在程序运行的时候在后台提供一种通用服务的线程,比如垃圾回收线程就是一个很称职的守护者,并且这种线程并不属于程序中不可或缺的部分.因此,当所有的非守护线程结束时,程序也就终止了,同时会杀死进程中的所有守护线程.反过来说,只要任何非守护线程还在运行,程序就不会终止.用户线程和守护线程两者几乎没有区别,唯一的不同之处就在于虚拟机的离开:如果用户线程已经全部退出运行了,只剩下守护

《Java并发编程实战》第八章 线程池的使用 读书笔记

一.在任务与执行策略之间的隐性解耦 有些类型的任务需要明确地指定执行策略,包括: . 依赖性任务.依赖关系对执行策略造成约束,需要注意活跃性问题.要求线程池足够大,确保任务都能放入. . 使用线程封闭机制的任务.需要串行执行. . 对响应时间敏感的任务. . 使用ThreadLocal的任务. 1. 线程饥饿死锁 线程池中如果所有正在执行任务的线程都由于等待其他仍处于工作队列中的任务而阻塞,这种现象称为线程饥饿死锁. 2. 运行时间较长的任务 Java提供了限时版本与无限时版本.例如Thread