进程与线程 - 入门篇


简介

首先用术语来讲一下,进程是系统进行资源调度和分配的基本单元,线程是进程的最小执行单元;
比如Windows中的任务管理器,就可以看到正在运行的进程。

PS:

  • 这里要注意一点,程序不等于进程

  • 程序是指令的集合,是静态的;进程是正在执行的程序,是活的

  • 当你双击运行程序(.exe文件)时,程序的指令会加载到内存中,此时你就会得到这个程序的进程

好了,术语讲完了,接下来开始讲人话。

1. 进程和线程的关系是怎么样的呢?

进程可以看作一个容器,线程就是容器内的最小执行单元;

我们用一个例子来说明,比如有一个宿舍(进程),宿舍里有两个人(线程),一个厕所(共享资源)

宿舍和人的关系就是进程和线程的关系

一个进程可以包含多个线程。

2.既然有了进程,为啥还要有线程呢?

  1. 每个进程都有自己独立的数据空间,进程之间不共享这些数据资源,通讯不方便;
    但是线程不一样,一个进程内的多个线程共享这个进程的数据资源,通讯方便

  2. 多进程之间切换开销大;
    但是多线程不会,线程来回切换开销很小
    (这里简单解释下,引入一个虚拟空间的概念,多个进程拥有不同的虚拟空间和缓存,但是多个线程共享进程的虚拟空间和缓存,进程切换之后,缓存失效,要重新去寻址虚拟空间,但是线程因为共享空间,缓存还是可以用的,所以比进程快)

3. 多线程都有哪些好处呢?

多线程相互协作,重复利用系统资源,提高系统吞吐率

如果只是单个线程,那么程序在执行比较耗时的操作(比如IO)时,CPU 是处于空闲的状态,就会造成资源的浪费

但是多线程可以切换到其他线程,继续执行其他任务,从而充分利用CPU
比如我们在看电影的时候,眼睛在工作,耳朵也在工作,这样就可以充分利用我们的身体去享受电影;

但是如果眼睛和耳朵要分开工作,那就难受了(脑补一下声音画面不同步的场景)

4. 多线程要怎么确保数据安全呢?

有多种方式:

  • 局部变量,即单个线程内定义的局部变量只有自己可见,那肯定是安全的

  • 只读对象,即共享的对象是只读的,那肯定也是安全的

  • 线程安全类,即类本身是线程安全的,那么基于这个类的操作肯定也是安全,比如StringBuffer类

  • 同步与锁机制,即用户自己通过加锁,来确保数据安全;这个会导致程序变得复杂且容易出现问题

5. 线程的生命周期都有哪些呢?

通过JDK源码可以看到,线程的生命周期有6个状态,如下所示

 public enum State {
        NEW, // 创建了线程,但是啥也没干
        RUNNABLE, // 启动了线程,处于运行状态
        BLOCKED, // 阻塞了线程,处于阻塞状态
        WAITING, // 等待状态,没有时间限制,直到有其他事件通知
        TIMED_WAITING, // 等待状态,有时间限制,时间到了,会返回到运行状态
        TERMINATED; // 终止状态,线程结束
    }

6. 这些状态之间的关系是咋样的呢?

可以用一张图来描述,如下所示

线程状态图

7. 那么线程的创建 New 有几种方式呢?

三种:

  1. (不推荐)继承Thread类,但是这样的话不符合LSP原则(里氏替换原则)

  2. (推荐)实现Runnable接口,比第一种灵活,也更加安全

  3. (推荐)实现Callable接口,相比于第二种,多了返回值和异常抛出

8. BLOCKED 状态一般什么情况下会出现呢?

遇到锁的情况下,如果锁没有释放,那么线程就会阻塞

9. WAITING 和 TIMED_WAITING有啥区别,不都是等待状态吗?

WAITING 状态会无休止的等待下去,直到其他事件通知它,它才会停止等待,进入RUNNABLE状态(被动)

TIMED_WAITING 状态会有一个等待最长时间,如果到了等待最长时间,还没有人通知它,它会自动停止等待,进入RUNNABLE状态(被动+主动)

总结

上面只是简单介绍了线程和进程,真正要学的话东西还是很多的。

最后,感谢小伙伴们阅读,谢谢!

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值