写点什么

一文讲明白 Java 中线程与进程、并发与与并行、同步与异步

作者:EquatorCoco
  • 2024-03-05
    福建
  • 本文字数:1337 字

    阅读完需:约 4 分钟

写在开头


ok,everybody,在过去的两周内,我们大体上讲完了 Java 的集合,在最后我们探讨了关于 HashMap 线程不安全的原因,又提出了 ConcurrentHashMap 这个线程安全的集合解决方案,那么在接下来的 2-3 周内,我们就一起来学习一下 Java 中的并发多线程。在开始学习之前,我们必须要搞清楚几个概念:线程与进程、并发与并行、同步与异步。


线程与进程


Java 的并发指的是多线程,而与多线程对应的有个进程的概念,啥是进程呢?我们通过CTRL+SHIFT+ESC组合快捷键打开电脑的任务管理器,我们就看到了如下的这幅图。



这里面执行的每一条就是一个进程,它是程序执行时的一个实例,操作系统会为每个进程分配独立的内存地址空间,因此,进程也是系统进行资源分配和调度的基本单位。


而线程是比进程更小的执行单位,是进程的子任务,因此它本身不会独立存在,系统不会为线程分配内存,线程组之间只能共享所属进程的资源,而线程仅仅是 CPU 调度和分派的基本单位,当前线程 CPU 时间片用完后,会让出 CPU 等下次轮到自己时候在执行。


进程与线程的关系


  1. 一个程序至少一个进程,一个进程至少一个线程,进程中的多个线程是共享进程的资源(堆,字符串常量池(JDK1.8)/方法区(JDK1.7));

  2. 一个进程中有多个线程,多个线程共享进程的堆和方法区资源,但是每个线程有自己的程序计数器,栈区域;



  1. Java 中当我们启动 main 函数时候就启动了一个 JVM 的进程,而 main 函数所在线程就是这个进程中的一个线程,也叫做主线程。 我们通过 JMX(Java Management Extensions)管理器去监控一下 JVM,看下面这段代码示例:【代码示例 1】


public class Test {    public static void main(String[] args) {        // 获取 Java 线程管理 MXBean        ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();        // 不需要获取同步的 monitor 和 synchronizer 信息,仅获取线程和线程堆栈信息        ThreadInfo[] threadInfos = threadMXBean.dumpAllThreads(false, false);        // 遍历线程信息,仅打印线程 ID 和线程名称信息        for (ThreadInfo threadInfo : threadInfos) {            System.out.println("[" + threadInfo.getThreadId() + "] " + threadInfo.getThreadName());        }    }}
复制代码


输出:


[6] Monitor Ctrl-Break //监控Ctrl-Break中断信号的线程[5] Attach Listener //添加事件[4] Signal Dispatcher // 分发处理给 JVM 信号的线程[3] Finalizer //调用对象 finalize 方法的线程[2] Reference Handler //清除 reference 线程[1] main //main 线程,程序入口
复制代码


由此可见一个 JVM 进程在运行时,包含了很多个子线程。


并发与并行


并行: 指两个或两个以上事件或活动在同一时刻发生。如多个任务在多个 CPU 或 CPU 的多个核上同时执行,不存在 CPU 资源的竞争、等待行为。

并发: 并发指在某时刻只有一个事件在发生,某个时间段内由于 CPU 交替执行,可以发生多个事件,存在对 CPU 资源进行抢占。


同步与异步


同步: 发出一个调用之后,在没有得到结果之前, 该调用就不可以返回,一直等待。

异步: 调用在发出之后,不用等待返回结果,该调用直接返回。


文章转载自:JavaBuild

原文链接:https://www.cnblogs.com/JavaBuild/p/18053171

体验地址:http://www.jnpfsoft.com/?from=001

用户头像

EquatorCoco

关注

还未添加个人签名 2023-06-19 加入

还未添加个人简介

评论

发布
暂无评论
一文讲明白Java中线程与进程、并发与与并行、同步与异步_Java_EquatorCoco_InfoQ写作社区