乐趣区

关于java:进程与线程-入门知识篇

前言

大家好啊,我是汤小圆。

明天给大家举荐的是,过程与线程的入门常识,心愿对大家有帮忙,谢谢。

简介

首先用术语来讲一下,过程是零碎进行资源调度和调配的根本单元,线程是过程的最小执行单元;

比方 Windows 中的工作管理器,就能够看到正在运行的过程,如下所示

PS:这里要留神一点,程序不等于过程

程序是指令的汇合,是动态的;过程是正在执行的程序,是活的

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

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

知识点

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

过程能够看作一个容器,线程就是容器内的最小执行单元;

咱们用一个例子来阐明,比方有一个宿舍(过程),宿舍里有两个人(线程),一个厕所(共享资源)

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

一个过程能够蕴含多个线程。

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

  1. 每个过程都有本人独立的数据空间,过程之间不共享这些数据资源,通信不不便;

    然而线程不一样,一个过程内的多个线程共享这个过程的数据资源,通信不便

  2. 多过程之间切换开销大;

    然而多线程不会,线程来回切换开销很小

    (这里简略解释下,引入一个虚拟空间的概念,多个过程领有不同的虚拟空间和缓存,然而多个线程共享过程的虚拟空间和缓存,过程切换之后,缓存生效,要从新去寻址虚拟空间,然而线程因为共享空间,缓存还是能够用的,所以比过程快)

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

多线程相互协作,反复利用系统资源,进步零碎吞吐率

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

然而多线程能够切换到其余线程,继续执行其余工作,从而充分利用 CPU

比方咱们在看电影的时候,眼睛在工作,耳朵也在工作,这样就能够充分利用咱们的身材去享受电影;

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

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

有多种形式:

  1. 局部变量,即单个线程内定义的局部变量只有本人可见,那必定是平安的
  2. 只读对象,即共享的对象是只读的,那必定也是平安的
  3. 线程安全类,即类自身是线程平安的,那么基于这个类的操作必定也是平安,比方 StringBuffer 类
  4. 同步与锁机制,即用户本人通过加锁,来确保数据安全;这个会导致程序变得复杂且容易呈现问题

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

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

public enum State {
NEW, // 创立了线程,然而啥也没干
RUNNABLE, // 启动了线程,处于运行状态
BLOCKED, // 阻塞了线程,处于阻塞状态
WAITING, // 期待状态,没有工夫限度,直到有其余事件告诉
TIMED_WAITING, // 期待状态,有工夫限度,工夫到了,会返回到运行状态
TERMINATED; // 终止状态,线程完结
}

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

能够用一张图来形容,如下所示,能够看到除了 NEW 状态和 TERMINATED 状态,其余状态都是跟 RUNNABLE 状态互通的

7. 那么线程的创立 New 有几种形式呢?

三种

  1. (不举荐)继承 Thread 类,然而这样的话不合乎 LSP 准则(里氏替换准则,具体内容可参考:https://www.jianshu.com/p/cf9f3c7c0df5)
  2. (举荐)实现 Runnable 接口,比第一种灵便,也更加平安
  3. (举荐)实现 Callable 接口,相比于第二种,多了 返回值 异样抛出

8. BLOCKED 状态个别什么状况下会呈现呢?

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

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

WAITING 状态会无休止的期待上来,直到其余事件告诉它,它才会进行期待,进入 RUNNABLE 状态(被动)

TIMED_WAITING 状态会有一个期待最长工夫,如果到了期待最长工夫,还没有人告诉它,它会主动进行期待,进入 RUNNABLE 状态(被动 + 被动)

总结

下面只是简略介绍了线程和过程,真正要学的话货色还是很多的

参考书籍

  1. Java 并发编程实战
  2. 实战 Java 高并发程序设计(第二版)

参考链接

  1. 里氏替换准则:https://www.jianshu.com/p/cf9f3c7c0df5

后记

最初,感激大家的观看,谢谢。

退出移动版