当前位置: 首页 > news >正文

JavaEE: 进程和线程

文章目录

    • 进程线程的概念和区别总结
    • 如何创建线程
      • 1.继承Thread重写run
      • 2.实现Runnable重写run
      • 3.继承Thread重写run,通过匿名内部类来实现
      • 4. 实现Runnable重写run,通过匿名内部类来实现
      • 5.基于lambda表达式来创建
  • 虚拟线程

并发编程: 通过写特殊的代码,把多个CPU核心都利用起来,这样的代码就称为“并发编程”。

多进程编程,就是一种典型的并发编程。

多进程编程,最大的问题是进程太“重”(创建进程 / 销毁进程的开销比较大)

为了解决进程开销比较大的问题,于是发明了“线程”(Thread)

线程可以理解成更轻量的进程,它也能解决并发编程的问题,但是创建/销毁的开销,比进程更低

所谓的进程,在系统中是通过PCB这样的结构体来描述,通过链表的形式来组织的.
对于系统中,线程,同样也是通过PCB来描述的(Linux)

一个进程,其实是一组PCB.
一个线程,是一个PCB.
一个进程中,可以包含多个线程,此时每个线程,都可以独立的到CPU上调度执行

线程是系统"调度执行"的基本单位
进程是系统"资源分配"的基本单位
如果有多个线程在一个进程中,那么每个线程都会有自己的状态,优先级,上下文,记账信息, 每个线程都会各自独立的在CPU上调度执行.
同一个进程中的这些线程,共用一份系统资源(CPU,内存,硬盘,网络带宽…)

线程比进程更轻量,主要就在于创建线程省去了"分配资源"(开销大)的过程,销毁线程也省去了"释放资源"的过程.

一旦创建进程,同时也会创建第一个线程 => 就会负责分配资源…
一旦后续创建第二,第三个线程 就不必再重新分配资源了

举个例子:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

进程线程的概念和区别总结

  1. 进程包含线程
    一个进程里可以有一个线程,也可以有多个线程,不能没有线程
  2. 进程是系统资源分配的基本单位
    线程是系统调度执行的基本单位
  3. 同一个进程里的线程之间,共用同一份系统资源(内存,硬盘,网络带宽等…)尤其是"内存资源",就是代码中定义的变量/对象…(编程中,多个线程是可以共用同一份变量的)
  4. 线程是当下实现并发编程的主流方式,通过多线程就可以充分利用好多核CPU
    但是,也不是线程数目越多就越好的,线程数目达到一定程度,把多个核心都利用充分了之后,此时继续增加线程,无法再提供效率,甚至可能会影响效率(线程调度也是有开销的)
  5. 多个线程之间,可能会相互影响.线程安全问题,一个线程抛出异常,可能会把其他线程一起带走.
  6. 多个进程之间,一般不会相互影响,一个进程崩溃了,不会影响到其他进程(这一点也称为"进程的隔离性").

如何创建线程

1.继承Thread重写run

创建类,继承Thread重写run方法

class MyThread extends Thread {@Overridepublic void run() {//这里写的代码,就是即将创建出的线程要执行的逻辑}
}

在main方法中创建实例

public static void main() {MyThread t = new MyThread();//创建线程t.start();
}

调用start就会在进程内部创建出一个新的线程,新的线程就会执行刚才run里面的代码

2.实现Runnable重写run


class MyRunnable implements Runnable {@Overridepublic void run() {//描述了线程要完成的逻辑是啥}
}//通过Runnable的方法来创建线程
public class Demo2 {public static void main(String[] args) {MyRunnable runnable = new MyRunnable();Thread t = new Thread(runnable);t.start();}
}

Runnable 就是用来描述"要执行的任务"是什么.

有的人认为Runnable这种做法更有利于"解耦合"
理由:这个Runnable只是一个任务,并不是和"线程"这样的概念强相关,后续执行这个任务的载体,既可以是线程,也可以是其他的东西(比如线程池,虚拟线程).

3.继承Thread重写run,通过匿名内部类来实现

本质上和1一样

    public static void main(String[] args) {Thread t = new Thread() {@Overridepublic void run() {//描述了线程要完成的逻辑是啥}};t.start();}
  1. 定义内部类,这个类是Thread的子类
  2. 类的内部重写父类的run方法
  3. 创建一个子类的实例,并且把实例的引用赋值给了t

4. 实现Runnable重写run,通过匿名内部类来实现

    public static void main(String[] args) {Thread t = new Thread(new Runnable() {@Overridepublic void run() {//描述了线程要完成的逻辑是啥}});//创建线程t.start();}

5.基于lambda表达式来创建

    public static void main(String[] args) {Thread t = new Thread(()->{//描述了线程要完成的逻辑是啥});t.start();}

虚拟线程

线程是轻量级进程,因为进程太重量了
随着对于性能要求进一步提高,我们开始嫌弃线程也太重量了
于是引入了"协程"(轻量级线程,纤程)

这个协程概念,在后续的Java版本中被引入了,起的名字叫"虚拟线程"

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 《云数据中心网络架构与技术》第四章:金融数据中心网络的总体架构与方案演进
  • 面壁发布端侧视觉理解模型 MiniCPM-V 2.6;ChatGPT 人形机器人二代正式发布丨 RTE 开发者日报
  • RabbitMQ高级特性 - 消息分发(限流、负载均衡)
  • Leetcode 第 135 场双周赛题解
  • 深入JVM:类加载器和双亲委派模型
  • 如何搭建一个圈子社区系统?开源社交陪玩交友圈子论坛帖子系统保姆级搭建教程!
  • 益九未来CEO曾宪军:创新引领,打造智能售货机行业新标杆
  • vue项目路径使用@报错
  • VS Code C/C++ MSVC编译器
  • 【React 】react 创建项目配置 jsconfig.json 的作用
  • Axure RP界面设计初探:基础操作与实用技巧
  • JavaScript青少年简明教程:异常处理
  • Java 面试常见问题之——static 的用法
  • Android 在布局中tools使用
  • Linux 调试追踪: trace-cmd 和 kernelshark
  • Angular4 模板式表单用法以及验证
  • css选择器
  • ES6 学习笔记(一)let,const和解构赋值
  • HTTP那些事
  • input实现文字超出省略号功能
  • Java 多线程编程之:notify 和 wait 用法
  • python docx文档转html页面
  • scrapy学习之路4(itemloder的使用)
  • Spring-boot 启动时碰到的错误
  • Vue.js-Day01
  • 番外篇1:在Windows环境下安装JDK
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 如何设计一个比特币钱包服务
  • 手写一个CommonJS打包工具(一)
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 用quicker-worker.js轻松跑一个大数据遍历
  • 翻译 | The Principles of OOD 面向对象设计原则
  • (7)摄像机和云台
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (二开)Flink 修改源码拓展 SQL 语法
  • (黑马C++)L06 重载与继承
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (转)Oracle 9i 数据库设计指引全集(1)
  • ./configure,make,make install的作用(转)
  • .aanva
  • .Net Core缓存组件(MemoryCache)源码解析
  • .net(C#)中String.Format如何使用
  • .NET/C# 避免调试器不小心提前计算本应延迟计算的值
  • .net6 core Worker Service项目,使用Exchange Web Services (EWS) 分页获取电子邮件收件箱列表,邮件信息字段
  • .NET开源快速、强大、免费的电子表格组件
  • .NET下的多线程编程—1-线程机制概述
  • .NET中使用Protobuffer 实现序列化和反序列化
  • /usr/bin/env: node: No such file or directory
  • @GetMapping和@RequestMapping的区别
  • @Transactional事务注解内含乾坤?
  • [ vulhub漏洞复现篇 ] Apache Flink目录遍历(CVE-2020-17519)
  • [.net]官方水晶报表的使用以演示下载
  • [Angular] 笔记 18:Angular Router
  • [Angular] 笔记 8:list/detail 页面以及@Input