01-JUC进阶-线程基础

  1. 一、Java多线程相关概念
  2. 二、用户线程和守护线程

一、Java多线程相关概念

  • 进程

    是程序的⼀次执⾏,是系统进⾏资源分配和调度的独⽴单位,每⼀个进程都有它⾃⼰的内存空间和系统资源

  • 线程

    • 在同⼀个进程内⼜可以执⾏多个任务,⽽这每⼀个任务我们就可以看做是⼀个线程
    • ⼀个进程会有1个或多个线程的
  • 管程

    Monitor(监视器),也就是我们平时所说的锁

    Monitor其实是一种同步机制,他的义务是保证(同一时间)只有一个线程可以访问被保护的数据和代码。

    JVM中同步是基于进入和退出监视器对象(Monitor,管程对象)来实现的,每个对象实例都会有一个Monitor对象,

    Object o = new Object();
    
    new Thread(() -> {
        synchronized (o)
        {
    
        }
    },"t1").start();
    

    Monitor对象会和Java对象一同创建并销毁,它底层是由C++语言来实现的。

同步指令

二、用户线程和守护线程

Java线程分为用户线程和守护线程,线程的daemon属性为true表示是守护线程,false表示是用户线程

  • 守护线程

    是一种特殊的线程,在后台默默地完成一些系统性的服务,比如垃圾回收线程

  • 用户线程

    是系统的工作线程,它会完成这个程序需要完成的业务操作

代码示例:

/**
 * <p>
 * 演示守护线程和用户线程
 * </p>
 */
public class DaemonDemo {
    public static void main(String[] args) {
        Thread a = new Thread(() -> {
            System.out.println(Thread.currentThread().getName() + " come in:\t"
                    + (Thread.currentThread().isDaemon() ? "守护线程" : "用户线程"));
            while (true) {

            }
        }, "a");
        a.setDaemon(true); // daemon设置为true,表示该线程为守护线程
        // setDaemon 必须在 start() 方法之前
        a.start();


        //暂停几秒钟线程
        try {
            TimeUnit.SECONDS.sleep(2);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println(Thread.currentThread().getName() + "\t" + " ----task is over");
    }
}

运行结果:

a come in:	守护线程
main	 ----task is over

结论:当主线程(用户线程)结束后,守护线程也随之结束了。

重点

  • 当程序中所有用户线程执行完毕之后,不管守护线程是否结束,系统都会自动退出

    如果用户线程全部结束了,意味着程序需要完成的业务操作已经结束了,系统可以退出了。所以当系统只剩下守护进程的时候,java虚拟机会自动退出

  • 设置守护线程,需要在start()方法之前进行


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 george_95@126.com