java并发:初探用户线程和守护线程

Posted juncaif

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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——并发编程

并发,又是并发

Java并发编程75个问答

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

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

并发编程之多线程基础-守护线程与非守护线程