java中进程的详细解析(含实例代码)

 更新时间:2026年05月21日 08:55:32   作者:驭渊的小故事  
Java进程管理涉及多个方面,包括进程的创建、监控、优化以及故障排查等,这篇文章主要介绍了java中进程的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下

一、操作系统

操作系统是计算机中的一个重要软件。

操作系统是一个搞管理的软件:

  • 管理各种硬件设备
  • 给各种应用程序提供一个稳定的运行环境,
    这些应用程序在运行中,即使有一个应用程序发生bug崩溃了,也不会影响其他应用程序的执行。

操作系统中的重要概念:进程

• 运行起来的程序就叫进程。

站在操作系统的视角,如何管理进程?

  1. 先描述
    使用结构体,描述出进程的核心属性,
    进程控制块(PCB),非常大的结构体,有很多个属性。

  2. 再把多个进程组织起来
    比如:Linux这样的操作系统,使用链表这样的方式,把每个PCB串一起。

操作系统本身也是一个软件,也是由一系列指令构成的,在启动时,CPU依次执行操作系统上的这些指令(引导操作系统起来)

• 所有的软件本质上都是靠CPU来执行的,CPU具体执行哪些指令,一定程度上受操作系统的影响

  1. 文件描述符
    进程在运行过程中,很多时候需要和硬盘这个硬件设备进行交互。
    硬盘上的数据,就是以文件的形式来组织的。
    进程在读写文件的时候,就需要打开文件,每个打开的文件相关的信息保存到文件描述符中,文件的每一项都对应着打开了的一份文件。

操作系统中,会把很多资源抽象成文件来表示,所以“文件”不只是硬盘上的类
例:网卡,操作系统管理网卡的时候,就是当作“文件”一样来管理

二、进程的运行

进程的运行,也会依赖到硬盘、网卡等相关硬件设备

进程运行,执行指令,都是靠CPU的。

  1. 进程是操作系统中,负责分配CPU的基本单位。
    分时复用:把一个单位时间,分成很多份,分别执行不同进程的指令
    第一份,执行进程1指令
    第二份,执行进程2的指令……
    因为CPU的运行速度是特别快,所以在切换的过程中,人眼很难察觉出变化了,像同时执行一样。

    • 把一个CPU核心上,按照分时复用,执行多个进程,就叫“并发执行”
      多个进程在一个CPU核心上在不同单位时间内执行

    • 多个CPU核心上,同时执行多个进程 称为“并行执行
      多个进程多个CPU核心同时执行

  2. 进程状态,

    • New(新建)
    • RUNNABLE(可运行)
    • BLOCKED(阻塞)
    • WAITING(等待)
    • TIMED_WAITING(超时等待)
    • TERMINATED(终止)
      • 进程有多种状态,下面是两个典型
        1)就绪状态 → 随时可以到CPU上执行
        2)阻塞状态 → 进程当前不适合到CPU上执行
  3. 进程有优先级
    为了保证需要大量CPU资源能的正常执行

  4. 进程的上下文
    因为有进程调度,一个进程执行一会,就会让出CPU,这期间CPU执行它会保存上次执行的状态,多进程继续执行

进程在CPU中运行的过程中
CPU上的各种寄存器,就保存了当前进程运行的“中间状态
寄存器上关于进程的信息,存放在内存中(PCB自己也会有对应空间)
恢复时:把PCB中刚才保存的属性,填回CPU的寄存器。

  1. 进程的记账信息
    统计功能,统计每个进程在CPU上运行了多久
    如果发现某个进程 很久没有吃到CPU资源,就会给它资源倾斜
    一点之后,防止这个进程饿死

new(新建),runnable(可运行)、blocked(阻塞)、waiting(等待)
timed_waiting(超时等待) terminated(终止)

三、多线程

  • 进程整体是一个比较“重”的概念

  • 创建进程/销毁进程开销比较大

  • 为了解决上述问题,引入线程,轻量级进程(创建销毁开销小)

    • 每个进程都相当于一个要执行的任务
    • 每个线程也是一个要执行的任务
  1. 进程包含线程
    每个进程中,都会包含一个或多个线程

  2. 进程是操作系统资源分配的基本单位
    进程内部所包含的多个线程之间,会共享上述的内存资源和硬盘资源,网络带宽。

进程创建,需要申请资源
进程的销毁,需要释放资源
→ 重量级事物,(代价大,时间消耗)

  • 对于线程来说,只是第一个线程创建的时候(和进程一起创建)申请资源,后续再创建线程,不再手动到资源申请操作(内核少,快)
  • 只有所有的线程都销毁(进程销毁)才会释放资源,单个进程销毁某个线程,也不会释放资源。
  • 可以理解为:在进程创建的时候给线程创建了一次资源,后续线程的创建和销毁都在这一层,只有进程被销毁这一次资源才会被回收

关于线程的调度,是随机的,我们的程序是感知不到,也干预不了。

那怎么提高效率?

引入多个线程, 确实可以提升效率, 但是资源一旦 就那么多,引入过多线程会使上下文切换开销增长,因为调度开销会拖累程序的性能。
而且其中一个线程抛出异常,会带走整个进程,所有的线程都无法运行
如果及时捕获,也不一定 终导致进程终止。

  • 创建第一个线程
class MyThread extends Thread {
    @Override
    public void run() {
        System.out.println("hello");
        try{
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            // throw new RuntimeException(e); // 处理异常的手段:抛出异常,导致程序异常终止
            break;
        }
    }
}

public class Test {
    public static void main(String[] args) {
        Thread t = new MyThread();
        t.start(); // 开启线程
    }
}

其中 Thread.sleep(); 会休眠

例:Thread.sleep(0); 这里是 让此线程放弃当前CPU资源,给别的线程用

run() 方法内,Thread.sleep()会抛出异常,但无法 throws,只能使用 try{} catch{}捕获。

  • 每个线程,调度顺序是随机的,无法预测。“抢占式执行”

创建线程的方法:

  1. 继承 Thread,重写 run

  2. 实现 Runnable 接口,重写 run
    例:

    • Runnable runnable = new MyRunnable();

    • Thread t = new Thread(runnable);

      class MyRunnable implements Runnable {
          @Override
          public void run() {
              System.out.println("我自己的 Runnable 的 run 方法");
          }
      }
      public class Deano01 {
      
          public static void main(String[] args) {
              Runnable r1 = new MyRunnable();
              Thread t1 = new Thread(new MyRunnable());
              Thread t2 = new Thread(r1);
              t1.start();
              t2.start();
          }
      }
    
      class MyThread extends  Thread{
          @Override
          public void run() {
              System.out.println("我自己的 Thread 的 run 方法");
          }
      }
      public class Deano01 {
      
          public static void main(String[] args) {
              // 1. 自己实现一个自己的Threa类
              Thread t = new MyThread();
              t.start();
              // 2. 使用 lamabda 表达式
              Thread t1 = new Thead(() -> {
                  System.out.println("我自己的 Thread 的 run 方法");
              });
          }
      }
    

    这个接口中,只有一个无参返回值的 run 方法
    可以使用 lambda 表达式 () -> { 要执行的代码 }
    在括号里没有参数!

总结 

到此这篇关于java中进程详细解析的文章就介绍到这了,更多相关java进程详解内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Springboot项目瘦身之如何将jar包与lib依赖分开打包

    Springboot项目瘦身之如何将jar包与lib依赖分开打包

    这篇文章主要介绍了Springboot项目瘦身之如何将jar包与lib依赖分开打包问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04
  • Java设计模式之享元模式(Flyweight Pattern)详解

    Java设计模式之享元模式(Flyweight Pattern)详解

    享元模式(Flyweight Pattern)是一种结构型设计模式,旨在减少对象的数量,以节省内存空间和提高性能,本文将详细的给大家介绍一下Java享元模式,需要的朋友可以参考下
    2023-07-07
  • Java Runtime类详解_动力节点Java学院整理

    Java Runtime类详解_动力节点Java学院整理

    Runtime类封装了运行时的环境。每个 Java 应用程序都有一个 Runtime 类实例,使应用程序能够与其运行的环境相连接。下面通过本文给大家分享Java Runtime类详解,需要的朋友参考下吧
    2017-04-04
  • Java设计模式编程中的工厂方法模式和抽象工厂模式

    Java设计模式编程中的工厂方法模式和抽象工厂模式

    这篇文章主要介绍了Java设计模式编程中的工厂方法模式和抽象工厂模式,设计模式的建立有利于团队协作时代码的共同维护,需要的朋友可以参考下
    2016-01-01
  • 详解java实现遍历二叉树的三种情况

    详解java实现遍历二叉树的三种情况

    这篇文章主要介绍了java实现遍历二叉树的三种情况,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04
  • Spring Boot Thymeleaf实现国际化的方法详解

    Spring Boot Thymeleaf实现国际化的方法详解

    这篇文章主要给大家介绍了关于Spring Boot Thymeleaf实现国际化的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Spring Boot具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-10-10
  • 教你怎么用idea创建web项目

    教你怎么用idea创建web项目

    好多朋友在使用IDEA创建项目时,总会碰到一些小问题.现在我们就演示一下使用IDEA创建web项目的完整步骤吧.文中有非常详细的图文示例哦,,需要的朋友可以参考下
    2021-05-05
  • Hibernate处理多对多关系的实现示例

    Hibernate处理多对多关系的实现示例

    本文介绍了Hibernate中实现多对多关系的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2026-01-01
  • SpringBoot实现接口参数加密解密的示例代码

    SpringBoot实现接口参数加密解密的示例代码

    加密解密本身并不是难事,问题是在何时去处理?SpringMVC 中给我们提供了 ResponseBodyAdvice 和 RequestBodyAdvice,利用这两个工具可以对请求和响应进行预处理,非常方便。废话不多说,我们一起来学习一下
    2022-09-09
  • Calcite使用SQL实现查询excel内容

    Calcite使用SQL实现查询excel内容

    因为calcite本身没有excel的适配器, 所以本文将模仿calcite-file, 搞一个calcite-file-excel实现查询excel内容,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-01-01

最新评论