Loading... 学习多线程,理解**进程和线程**是第一步~ 一个进程中包含多个线程,一个进程就相当于一个应用程序(就咱们平常安装的一些软件,比如qq,诶微信等等),一个应用程序底层就是 cpu 来运行的,比如我们的电脑同时打开了多个应用,表面看来像是在同时运行,实际上在同一时间只运行了一个应用程序,只不过 **cpu 的运行速度非常快,会进行高速切换,让我们觉得是在同时进行。** **最经典的一个例子就是迅雷了**,我们电脑打开迅雷相当于开了一个进程,当我们使用迅雷下载东西的时候,比如说,下载两部电影,那么在迅雷中就存在两个不同的执行路径,也就是有两个线程在同时做下载这么个动作,也就是同时在执行两个任务! 所以,`进程包含线程,相当于一个进程下所有线程的集合`。**一个线程就是一个执行路径。** 比如我们常写的Java代码中的main方法所在的线程就是一个==主线程==,我们创建的线程叫做==子线程==,**如果说一个项目中肯定有一个线程,那么这个线程就是主线程了。**  对于这个问题,`到底该怎么理解或者说区分线程和进程的概念`,再**举一个非常贴切的例子**,我们大多数人都用过QQ吧,我们打开一个QQ,其实就是开启了一个进程, 然后我们发送一段文字,那就是开启了一个线程,我们再发送一天语音,那就是又开启了一个线程,那么在这个QQ的进程中就有发文字和语言两个线程了,当然,可能还有其他的线程! ### 用户线程和守护线程 先看一段代码:  **上述代码一旦执行一定会存在两个线程:** 1. main主线程(==用户线程==) 2. 后台gc线程(==守护线程==) 那**什么是用户线程**呢?我们的main线程就是用户线程,这个是系统的工作线程,它会执行你线程当中设置的业务逻辑! 那**什么是守护线程呢**?对于我们熟知的gc(垃圾回收)线程就是一个守护线程,它跟用户线程有个最主要的区别就是**守护线程是不能单独存在的**,是在后台默默执行的,**随着一个用户线程而生,当所依附的用户线程挂掉之后,这个守护线程也就不存在了。** 对于线程可以通过以下设置是用户线程还是守护线程:  再强调一点,**守护线程不能单独存在**,如果所有的用户线程都执行完毕了,那么不管是否还有守护线程在执行任务,jvm都会退出,程序则会停止! 另外还有一个知识点需要注意,就是这里:  **这里的顺序是不能乱的,也就是设置守护线程要在start之前!** ### 什么是管程 这里大家需要了解下**什么是管程?**可能大家对这个概念不是很熟悉,都听说过什么线程啊,进程的,但是管程是什么东西? 管程其实就是`Monitor`,这是啥玩意,翻译过来其实就是`监视器`的意思,**说白了,这玩意就是我们平常所说的**==锁==,==多线程加锁==,知道了吧! 再说的官方点,这个**Monitor是一种同步机制**,什么意思嘞? 就是它可以==保证在同一个时间内只能有一个线程去访问被保护的数据和代码==,你看这不就是锁吗?我们加锁的目的不也就是为了保证数据安全,通常情况下不也就是保证只有一个线程可以去操作业务逻辑嘛,对吧,==所以这个叫做Monitor的监视器就是锁==! 我们再深入点分析,在我们的java虚拟机中,它的同步就是基于这个Monitor管程对象实现的,**我们的java对象其实都会伴生一个Monitor对象**,又因为同步机制就是由这个Monitor实现的,所以在我们的Java中,每一个java对象的创建和销毁都会伴随着一个Monitor对象的创建和销毁,因此,**我们的每一个Java对象天生就是一把锁!** 而这个Monitor的底层是由C++来实现的,我们不需要关注这个Monitor,而是注重于我们的Java对象,看个代码:  这段代码中,我们就把Object对象作为一把锁使用,记住,任何一个Java对象都可以作为一把锁使用! 最后修改:2021 年 12 月 13 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 0 如果觉得我的文章对你有用,请随意赞赏