Java:进程和线程

news2024/11/15 1:55:59

文章目录

    • 进程线程的概念和区别总结
    • 如何创建线程
      • 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 {
	@Override
	public void run() {
		//这里写的代码,就是即将创建出的线程要执行的逻辑
	}
}

在main方法中创建实例

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

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

2.实现Runnable重写run


class MyRunnable implements Runnable {
    @Override
    public 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() {
            @Override
            public 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() {
            @Override
            public void run() {
                //描述了线程要完成的逻辑是啥
            }
        });
        //创建线程
		t.start();
    }

5.基于lambda表达式来创建

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

虚拟线程

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1974235.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C# OpenCvSharp 打开4K高清摄像头

一、前言 整了个1200w像素的usb摄像头,使用 OpenCvSharp读取,读取和设置分辨率代码耗时居然10几秒,查询资料发现,必须对VideoCapture进行设置,使用DSHOW模式打开,并且设置分辨率代码下必须增加 指定MJPG编码…

php的mysql操作可实现简单登录功能

文章目录 1. 表单和请求(1) 表单操作(2) 网络请求(3) $_REQUEST超全局变量 2. mysql数据库操作1) mysqli连接操作2) 操作数据库3) 预处理语句4) pdo操作数据库5) 创建连接并执行查询语句 1. 表单和请求 主要使用到**$_GET** 和 $_POST这两个超全局变量,分别对应两种请求 (1) …

【2024蓝桥杯/C++/B组/小球反弹】

题目 分析 Sx 2 * k1 * x; Sy 2 * k2 * y; (其中k1, k2为整数) Vx * t Sx; Vy * t Sy; k1 / k2 (15 * y) / (17 * x); 目标1:根据k1与k2的关系,找出一组最小整数组(k1, k2)&#xff…

北京崇文门中医院贾英才主任解读头晕:症状与根源

头晕是一种常见的症状,可能由多种原因引起。为了更深入地了解头晕这一症状,我们有幸邀请到了北京崇文门中医院的贾英才主任,听听他对于头晕的见解。 北京崇文门中医院贾英才主任指出,头晕并非一种单一的疾病,而是许多潜…

鉴权-RBAC模型

文章目录 1.技术选型1.网址2.Sa-Token介绍3.[Sa-Token 功能一览](https://sa-token.cc/doc.html#/?idsa-token-功能一览) 2.鉴权数据模型设计1.数据模型图2.SQL1.用户信息表2.角色表3.用户角色表(关联表)4.权限表5.角色权限表(关联表&#x…

1518.换水问题

1.题目描述 超市正在促销,你可以用 numExchange 个空水瓶从超市兑换一瓶水。最开始,你一共购入了 numBottles 瓶水。 如果喝掉了水瓶中的水,那么水瓶就会变成空的。 给你两个整数 numBottles 和 numExchange ,返回你 最多 可以喝到…

辩论赛评委依据什么标准进行评分呢

在辩论赛中,评委依据什么标准进行对参赛个人和团队进行评分呢?下面对这两部分介绍一些常用评分标准。 一、 个人评分标准 语言表达 1、普通话标准、语速适中; 2、语调平仄合理; 3、口头、肢体语言和谐; 4、修辞得当、…

C基础项目(学生成绩管理系统)

目录 一、项目要求 二、完整代码实例 三、分文件编写代码实例 一、项目要求 1.系统运行,打开如下界面。列出系统帮助菜单(即命令菜单),提示输入命令 2.开始时还没有录入成绩,所以输入命令 L 也无法列出成绩。应提…

解决 Vue 页面中地址栏参数变更不刷新的问题

在一次Vue项目开发中,遇到了只改变路由中的参数,路由地址不改变页面数据不刷新的问题。造成这个问题的原因,是因为 vue-router 同一个页面地址栏参数改变(比如文章的发布和编辑是同一个页面),不会触发vue的…

cms-wordpress 漏洞

登录后台 一、后台改模板 点击外观,编辑, 找一个php文件,在最开头加入一句话木马; 点击更新,访问模板类路径下的这个文件(不知道默认模板路径可以搜) 使用工具连接 二、上传主题拿shell 点击外观,主题&am…

NeRF学习——基于Pytorch代码复现的笔记

代码复现的框架是基于:pengsida 的 Learning NeRF 源代码框架是基于 Linux 的,我在 Windows 上进行复现有些许 bug,Windows 上 bug 修复的框架版本:Learning NeRF 希望各位可以通过学习 NeRF-Pytorch 的源码来自己复现一下试试看…

Lanproxy开箱即用的内网穿透工服务!!

Lanproxy快速上手配置服务器转发到内网!! 本教程云服务器推荐使用的开发环境如下:服务器端配置配置端口登录Web界面 内网客户端配置下载客户端配置客户端端口 最终效果测试 本文主要记录了使用Lanproxy搭建内网穿透服务的过程,其中包括服务端和客户端的详…

使用redis缓存文章浏览量

效果展示 好处 首先初始化所有浏览量 访问文章后增加的浏览量**不直接修改数据库,先存到redis然后访问也是获取redis的浏览量,做个定时任务,后续自定义时间同步数据库**,好像也就是一个集中处理罢了 CommandLineRunner实现项目…

鸿蒙系统学习指南

🐟作者简介:一名大三在校生,喜欢编程🪴 🐡🐙个人主页🥇:Aic山鱼 🐠WeChat:z7010cyy 🦈系列专栏:🏞️ 前端-JS基础专栏✨前…

8月2日SpringBoot学习笔记

今日内容: AOP 面向切面 代理模式 springmvc 运行原理 拦截器 springmvc异常处理机制 代理模式 为其他对象提供一种代理以控制对这个对象的访问。想在访问一个类时做一些控制是使用。 静态代理 优点:便于理解 缺点: 1.代码冗余&…

Linux 内核源码分析---I/O 体系结构与访问设备

I/O 体系结构 与外设的通信通常称之为输入输出,一般都缩写为I/O。 在实现外设的I/O时,内核必须处理3个可能出现的问题: (1)必须根据具体的设备类型和模型,使用各种方法对硬件寻址; &#xff08…

java面试题Spring部分(四)

一、什么事spring的三级缓存 典型回答 在Spring的BeanFactory体系中,BeanFactory是Spring IOC容器的基础接口,其DefaultSingletonBeanRegistry类实现了BeanFactory接口,并维护了三级缓存: public class DefaultSingletonBeanRe…

如何在OpenHarmony 4.1R上设置系统默认不锁屏(修改系统锁屏应用)

本文介绍如何修改系统锁屏应用,从而实现在OpenHarmony 4.1R上设置系统默认不锁屏。 环境配置 1.DevEco Studio 4.1 Release,下载链接地址 API10 Full SDK,安装教程 步骤 1.首先下载4.1r分支的系统锁屏应用applications_screenlock 2.修改系统锁屏应…

【Plotly-驯化】一文画出漂亮的流量漏斗图:plotly.funnel函数使用技巧

【Plotly-驯化】一文画出漂亮的流量漏斗图:plotly.funnel函数使用技巧 本次修炼方法请往下查看 🌈 欢迎莅临我的个人主页 👈这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合,智慧小天地! 🎇 免费获…

HTML+CSS練習---空隙產生記錄

1.第一層和第二層之間的間隙&#xff1a;以為導航欄超過高度朝下擠下來了 2.第2層兩個div中的空隙 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Document</title><style>font-face {f…