首页 > 系统相关 >【JavaEE】【多线程】进程与线程的概念

【JavaEE】【多线程】进程与线程的概念

时间:2024-10-13 09:53:04浏览次数:8  
标签:执行 run Thread JavaEE 线程 进程 多线程 CPU

目录


一、进程

进程是操作系统对一个正在运行的程序的一种抽象,可以把进程看做程序的一次运行过程;
同时,在操作系统内部,进程又是操作系统进行资源分配的基本单位。

1.1 系统管理进程

  • 先描述一个进程:
    使用结构体(因为操作系统主要由c语言写成),再描述出进程的核心属性即进程控制块PCB(Process Control Block)。
  • 把多个进程组织起来:
    使用数据结构组织起来,Linux使用链表来组织。

1.2 系统操作进程

  • 进程的创建:创建一个PCB,初始化各个属性,加入到数据结构中。
  • 进程的销毁:在数据结构中找到并删除。
  • 查看进程列表:遍历查找到进程,现显示关键数据。

1.3 进程控制块PCB关键属性

  • pid (进程id):相当于身份证,每个进程不一样。
  • 一组内存指针:指向进程执行的指令,依赖。
  • 文件描述符表:进程运行时,多数要与硬盘进行交互,硬盘储存数据的方式是通过文件存储,而文件的信息就保存在文件描述符表中。操作系统回将很多资源抽象为文件。
  • 进程状态:两个主要的进程状态:1.就绪状态:进程随时能到CPU上执行,2.阻塞状态:进程当前不适合在CPU上执行。
  • 进程优先级:优先级越高,分配的CPU资源越多。
  • 进程的上下文:进程的调度原理,会使得进程在执行了一会之后会失去CPU,CPU再次执行回来时,要沿着上次结束状态执行。
    而进程在CPU上运行时,床铺上的各种寄存器就会记录当前进程的中间状态,
    将寄存器的各种记录保存到pcb对应属性,下次执行时又返回给对应寄存器就恢复了进程上下文。
  • 进程的记账信息:统计每个进程在CPU上执行了多久。如果该进程长时间没分配到CPU资源,就会给这个进程倾斜一些CPU资源。

1.4 cpu对进程的操作

CPU对进程的操作是 分时复用
分时复用就是指:把一份时间分为多份,每份时间执行对应的进程。由于CPU运行速度快,让进程切换的时间超过了肉眼反应。

并发执行:一个CPU核心上按照分时复用执行进程。
并行执行:多个CPU核心执行多个进程。
现代CPU都是两者兼备。

由于代码无法区分,平时就将两者合起来叫做“并发”

1.5 进程调度

进程调度就是指操作系统在并发执行进程时,进程之间的相互切换。
而上面PCB中的进程状态,进程优先级,进程上下文,进程记账信息就是支持进程调度的。

二、线程

线程:一个线程就是一个 “执行流”. 每个线程之间都可以按照顺讯执行自己的代码。就相当于是一个轻量级的进程。

2.1 线程与进程

线程与进程的关系是包含关系,每个进程中至少要有一个线程。
相当于周计划(进程)与日计划(线程)的关系。

2.2 线程资源分配

每个进程的创建需要申请资源,销毁需要释放资源。
而在一个进程中只有第一个线程创建需要申请资源,所有线程销毁完才需要释放资源。

而在一个进程中所有线程共享资源,这样会带来如果一个线程出问题,可能所有线程就出问题了。就像一个线程中抛出一个异常没处理,就将整个进程中的线程全部搞挂。
这样的好处是开销小,效率高,但是如果线程过多也会使线程调度开销大,影响效率。

2.3 线程调度

操作系统操作线程(一个进程内)也和进程一样有并发执行和并行执行。
线程也有线程状态,线程优先级,线程上下文,线程记账信息(与上诉进程的介绍一样,只需把进程改为线程即可)。
而内存指针和文件描述符表是一个进程中所有线程共享的。

三、线程与进程区别

  1. 进程是系统进行资源分配和调度的一个独立单位,线程是程序执行的最小单位。
  2. 进程有自己的内存地址空间,线程只独享指令流执行的必要资源,如寄存器和栈。
  3. 由于同一进程的各线程间共享内存和文件资源,可以不通过内核进行直接通信。
  4. 线程的创建、切换及终止效率更高。

四、线程简单操作代码

4.1 创建线程

创建线程有两种方式:

  • 使用类继承Thread类,重写run方法。在主函数中创建好对象后调用start方法就创建好了一个线程。
class MyThread extends Thread {
    @Override
    public void run() {
        //写代码
    }
}
public class Demo1 {
    public static void main(String[] args) {
        Thread thread = new MyThread();
        thread.start();

    }
}

  • 实现Runnable接口,重写run方法,通过Thread创建对象时,将实现Runnable接口的类对象传到构造函数中,在调用start方法。
class MyRunnable implements Runnable {
    @Override
    public void run() {
        
    }
}


public class Demo2 {
    public static void main(String[] args) {
        MyRunnable myRunnable = new MyRunnable();
        Thread thread = new Thread(myRunnable);
        thread.start();
    }
}

  • 还可以使用匿名内部类
Thread thread = new Thread() {
@Override
    public void run() {
        //写代码
    }
}


Thread thread = new Thread(new Runnable) {
@Override
    public void run() {
        //写代码
    }
}
  • lambda 表达式
Thread thread = new Thread ( () -> {
 //写代码不用重写run方法
});

4.1.1 start()与run()区别

作用功能不同:

  • run方法的作用是描述线程具体要执行的任务;
  • start方法的作用是真正的去申请系统线程

运行结果不同:

  • run方法是一个类中的普通方法,主动调用和调用普通方法一样,会顺序执行一次;
  • start调用方法后, start方法内部会调用Java 本地方法(封装了对系统底层的调用)真正的启动线程,并执行run方法中的代码,run 方法执行完成后线程进入销毁阶段。

4.2查看线程

在当前电脑上看由Java写的线程可以找到安装使用的JDK写的bin目录里面的Jconsole.exe程序。

运行这个程序里面就可以看当前的线程。

标签:执行,run,Thread,JavaEE,线程,进程,多线程,CPU
From: https://blog.csdn.net/yj20040627/article/details/142531661

相关文章

  • 【JavaEE】【多线程】Thread类讲解
    目录一、Thread构造方法二、Thread的常见属性三、创建一个线程四、获取当前线程引用五、终止一个线程5.1使用标志位5.2使用自带的标志位六、等待一个线程七、线程休眠八、线程状态九、线程安全9.1线程不安全原因总结9.2解决由先前线程不安全问题例子一、Thre......
  • 2024java最新面试题-10张图!彻底搞定Java线程状态转换
    Java线程状态有几个?Java线程状态是如何转换?Java线程状态转换什么情况会进入锁的等待队列?Java线程状态转换什么情况会进入锁的同步队列?一提到Java线程状态,不少读者立马想到线程状态转换图,但细想,印象又不深刻,只记得有那么几个状态。再要你说出Java线程状态是如何转换的,脑子里......
  • C#线程---ThreadPool
    线程池的简介   为每个短暂的异步操作创建线程会产生显著的开销,线程池可以成功地适应于任何需要大量短暂的开销大的资源的情形。我们事先分配一定的资源,将这些资源放入到资源池。每次需要新的资源.只需从池中获取一个,而不用创建一个新的。当该资源不再被使用时,就将其返......
  • java 网络知识 + 多线程问题
    服务器:packagep1007;importjava.io.*;importjava.net.*;importjava.util.Random;publicclassServer{publicstaticvoidmain(String[]args){intport=12345;//服务端口try(ServerSocketserverSocket=newServerSocket(port)......
  • 利用线程池和网络动态库实现多人聊天室
    利用线程池和网络动态库实现多人聊天室概述本项目实现一个简单的多人聊天室,采用C语言编写,利用线程池和网络动态库,实现服务端消息转发和客户端消息接收。服务端服务端主要负责管理客户端连接,接收并转发消息。代码实现#include<stdio.h>#include<stdlib.h>#include......
  • Redis 单线程模型
    Redis是单线程的,但仍然非常快,主要得益于以下几个因素:I/O多路复用:Redis使用I/O多路复用技术(比如epoll),使它能够高效处理大量连接,即便是单线程内存操作:Redis的大部分操作都是内存级别的,避免了磁盘I/O的瓶颈避免上下文切换:由于是单线程,Redis不需要频繁地在线程之间切换,......
  • linux中的线程
    线程一个进程可以包含多个线程。同一程序中的所有线程均会独立执行相同程序,且共享同一份全局内存区域,其中包括初始化数据段(initializeddata)、未初始化数据段(uninitializeddata),以及堆内存段(heapsegment)多线程的进程内存布局文本段、数据段这些,线程共享,然后会为每个线程分......
  • JavaEE: 深入解析HTTP协议的奥秘(1)
    文章目录HTTPHTTP是什么HTTP协议抓包fiddle用法HTTP请求响应基本格式HTTPHTTP是什么HTTP全称为"超文本传输协议".HTTP不仅仅能传输文本,还能传输图片,传输音频文件,传输其他的各种数据.因此它广泛应用在日常开发的各种场景中.HTTP往往是基于传输层的......
  • gdb多线程多进程调试命令
    多线程infothreads查看当前所有运行线程的列表thread线程编号 切换到特定线程进行调试setscheduler-lockingon只运行当前线程,停止其他线程进行调试多进程infoinferions显示所有正在调试的进程inferion进程编号 切换到特定进程运行,同时挂起其他进程detach-on-fo......
  • Java并发编程-线程池
    ThreadLocal应用场景:两个线程争执一个资源。解决问题:实现每个线程绑定自己的专属本地变量,可以将ThreadLocal类理解成存放数据的盒子,盒子中存放每个线程的私有数据。线程池的用途选择快速响应用户请求:比如说用户查询商品详情页,会涉及查询商品关联的一系列信息如价格、优......