Java线程与进程

线程

概念

Java中,线程是程序执行的最小单位,它是进程的一个执行流,也是CPU调度和分配的基本单位。每个进程都可以运行多个线程,这些线程共享进程的内存块,但每个线程都有自己的堆栈和局部变量。

Java中的线程有两种类型:用户线程和守护线程。用户线程是程序的主要执行部分,而守护线程则是在后台运行的线程,用于执行一些支持性的任务,如垃圾回收。当所有用户线程都结束时,守护线程也会随JVM一起退出。

创建线程

一般创建线程有两种方式:

继承java.lang.Thread类并重写run方法。这种方式下,直接创建一个Thread类的子类,并重写其run方法。在run方法中编写线程要执行的代码。然后,创建一个该子类的实例,并调用其start方法来启动线程。需要注意的是,不能直接调用run方法,否则只是在普通的方法调用中执行了线程
代码,而没有启动新的线程。

实现java.lang.Runnable接口并重写run方法。这种方式下,我们创建一个实现了Runnable接口的类,并重写其run方法。然后,创建一个Thread类的实例,并将该Runnable对象作为参数传递给Thread类的构造函数。最后再调用Thread对象的start方法来启动线程。

public class Main {public static void main(String[] args) {MyThread myThread = new MyThread();myThread.start(); // 启动线程new Thread(new MyRunnable()).start(); // 创建并启动线程}
}// 法一
class MyThread extends Thread {@Overridepublic void run() {// 线程执行的代码System.out.println("MyThread is running!");}
}// 法二
class MyRunnable implements Runnable {@Overridepublic void run() {// 线程执行的代码  System.out.println("MyRunnable is running!");}
}

单线程与多线程

单线程指的是程序在执行过程中,按照连续的顺序执行代码,前面的任务必须完成后,后面的任务才会开始执行。单线程的执行方式相对简单,系统稳定性较高,扩展性强,软件资源丰富,多用于点对点的服务。例如,当处理时间短或者启动频率高的服务时,通常使用单线程。

比如我们刚刚只启动了一个线程输出到控制台;

多线程则是指从软件或硬件上实现多个线程并发执行的技术。多线程程序能够将工作拆分到多个软件线程,这些线程可以由不同的CPU内核并行处理,从而提高整体处理性能。当程序包含复杂的计算任务,或者需要处理速度较慢的外围设备(如打印或网络操作)时,通常会使用多线程。此外,当程序需要同时完成多项任务,或者需要提高程序的响应速度时,也会使用多线程。

比如一个网站同时有100个人浏览,那么服务器就要启动多线程来运行,使得每个用户不需要等待。如果这里还是用单线程,那么必然导致有人会等前边的人访问完才能访问,所以要使用多线程,让每个用户的线程都基本无需等待就能访问到。

进程

进程(Process)是操作系统进行资源分配和调度的基本单位,它是程序的一次执行过程。一个进程包含一个运行中的程序及其数据、系统资源和线程等。进程和程序的区别在于,程序是一组静态的指令集合,而进程是程序的一次动态执行过程。进程具有动态性、并发性、独立性和结构性的特点。

例如打开QQ程序,QQ就是一个进程,QQ进程中可以有多个线程。

下图中我们看到有4个名为QQ.exe的进程,但是下面的线程窗口(Thread)中与QQ.exe相关的不止4个

线程与进程的区别

线程与进程的主要区别:

资源拥有:进程是拥有资源的一个独立单位,系统会给进程分配独立的内存空间和其他资源,如文件句柄、网络连接等。而线程是进程的一部分,它共享进程所拥有的资源,包括内存空间、文件句柄等。因此,线程之间共享数据变得更容易,但同时也需要注意同步和互斥问题。

执行方式:每个进程都有自己独立的执行环境和执行序列,系统通过进程切换来实现不同进程之间的并发执行。而线程是进程中的执行单元,多个线程共享同一个进程的地址空间,线程之间通过共享进程的资源来实现并发执行。线程的执行是由进程来启动和管理的,每个线程都有一个线程ID、程序计数器、寄存器集合和栈等执行上下文。

系统开销:由于进程拥有独立的资源,因此在创建、切换和销毁进程时,系统需要分配和回收大量的资源,开销较大。而线程共享进程的资源,创建、切换和销毁线程的开销相对较小,因此更适合用于实现大量的并发执行。

安全性:进程是独立的执行环境,一个进程出现问题不会影响其他进程的执行,因此多进程程序更加安全、生命力更强。但是,线程之间的共享数据可能会导致同步和互斥问题,如果处理不当,可能会出现数据不一致、死锁等问题,因此多线程程序需要更加小心地设计和实现。

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

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

相关文章

Mysql运维篇(四) Xtarbackup--备份与恢复练习

一路走来,所有遇到的人,帮助过我的、伤害过我的都是朋友,没有一个是敌人。如有侵权,请留言,我及时删除! 前言 xtrabackup是Percona公司CTO Vadim参与开发的一款基于InnoDB的在线热备工具,具有…

Compose自定义动画API指南

很多动画API都可以自定义其参数达到不同的效果,Compose也提供了相应的API供开发者进行自定义动画规范。 AnimationSpec 主要用存储动画规格,可以自定义动画的行为,在animate*AsState和updateTransition函数中,此函数默认参数为s…

【防网盘在线解压】Peazip 豌豆压缩 v9.7.0

软件介绍 Peazip 是一个免费的文件归档应用程序, 支持跨平台,是和WinRar、WinZip类似软件的开源免费替代品;支持压缩/ 存档到 7Z, ARC、Brotli BR、BZip2、GZip、 PAQ、PEA、RAR、自解压档案、TAR、WIM、XZ、Zstandard ZST、打开…

数据检索:倒排索引加速、top-k和k最邻近

之前在https://www.yuque.com/treblez/qksu6c/wbaggl2t24wxwqb8?singleDoc# 《Elasticsearch: 非结构化的数据搜索》我们看了ES的设计,主要侧重于它分布式的设计以及LSM-Tree,今天我们来关注算法部分:如何进行检索算法的设计以及如何加速倒排…

挑战杯 wifi指纹室内定位系统

简介 今天来介绍一下室内定位相关的原理以及实现方法; WIFI全称WirelessFidelity,在中文里又称作“行动热点”,是Wi-Fi联盟制造商的商标做为产品的品牌认证,是一个创建于IEEE 802.11标准的无线局域网技术。基于两套系统的密切相关&#xff…

【数据结构】LRU Cache

文章目录 LRUCache LRUCache 1. LRUCache是一种缓存的替换技术,在CPU和main memory之间根据计算机的局部性原理,往往会采用SRAM技术来构建CPU和主存之间的高速缓存,DRAM(dynamic random access memory)用于构建主存,LRUCache这种…

命令行参数和环境变量

命令行参数 命令行参数是在用户在命令行中输入命令时,跟随命令一起输入的一些附加信息。这些参数可以用来配置命令的行为或传递一些数据给命令。 让同样的程序在不同的命令行参数下运行出不同的结果! 将这些命令和参数可以传给 main 函数生&#xff0…

【教程】MySQL数据库学习笔记(一)——认识与环境搭建(持续更新)

写在前面: 如果文章对你有帮助,记得点赞关注加收藏一波,利于以后需要的时候复习,多谢支持! 【MySQL数据库学习】系列文章 第一章 《认识与环境搭建》 第二章 《数据类型》 文章目录 【MySQL数据库学习】系列文章一、认…

图像识别基础之模板匹配

principle 图像匹配 本质:图像的相似度很高(矩阵的相似度很高) code /*\brief 我的图像匹配函数,获取差方和均值最小的矩阵作为结果\param srcPicFile:用以匹配的图像文件\param templatePicFile:模板图像文件\param destPicFile:输出的检测结果文件…

汇报工作时,你的工作会让领导满意吗?

当前你正在做的事 众所周知,跟领导汇报,第一件事需着重汇报你正在做的事,否则领导会感觉你无所事事。 举个例子: 完成了某某项目,在这项目中我负责:协调不同科室之间的纠纷,并把问题集中上报给…

阿里云幻兽帕鲁服务器配置4核16G10M带宽够8个人玩吗?玩起来流畅度怎么样?

阿里云幻兽帕鲁服务器配置4核16G10M带宽这个,个人实测下来,五六个人玩是比较流畅的,不过8个人的话,估计会有点卡。如果是8个人的话,我建议选择8核32G那个配置,更加适合一些。 阿里云一键部署幻兽帕鲁详细教…

分布式锁redisson

文章目录 1. 分布式锁1.1 基本原理和实现方式对比synchronized锁在集群模式下的问题多jvm使用同一个锁监视器分布式锁概念分布式锁须满足的条件分布式锁的实现 1.2 基于Redis的分布式锁获取锁&释放锁操作示例 基于Redis实现分布式锁初级版本ILock接口SimpleRedisLock使用示…

原型模式-Prototype Pattern

原文地址:https://jaune162.blog/design-pattern/prototype-pattern/ 引言 在Java中如果我们想要拷贝一个对象应该怎么做?第一种方法是使用 getter和setter方法一个字段一个字段设置。或者使用 BeanUtils.copyProperties() 方法。这种方式不仅能实现相同类型之间对象的拷贝,…

CMake进行C/C++与汇编混合编程

1. 前提 这篇文章记录一下怎么用CMake进行项目管理, 并用C/C和汇编进行混合编程, 为了使用这项技术, 必须在VS的环境中安装好cmake组件 由于大部分人不会使用C/C与汇编进行混合编程的情况。所以这篇文章并不适用于绝大部分人不会对其中具体细节进行过多叙述。只是做一些简单的…

正确看待OpenAI大模型Sora

2月16日凌晨,OpenAI发布了文生视频模型Sora。官方是这样描述的:Sora is an AI model that can create realistic and imaginative scenes from text instructions.Sora一个人工智能模型,它可以根据文本指令创建逼真和富有想象力的场景。Sora…

网络安全防御保护 Day5

今天的任务如下 要求一的解决方法: 前面这些都是在防火墙FW1上的配置。 首先创建电信的NAT策略 这里新建转换后的地址池 移动同理,不过地址池不一样 要求二的解决方法: 切换至服务器映射选项,点击新建,配置外网通过…

Java 基于 SpringBoot+Vue 的校园交友网站,附源码

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…

DarkSide针对VMware EXSI系统进行加密

前言 最近黑客组织利用DarkSide勒索病毒对Colonial Pipeline 发起勒索攻击,国内外各大安全厂商和安全媒体也都有相关报道,DarkSide勒索软件是从2020年8月出现,并以(RAAS)勒索即服务的商业模式进行运作,此勒索病毒不仅可以部署基于…

详解 Redis 实现数据去重

✨✨ 欢迎大家来到喔的嘛呀的博客✨✨ 🎈🎈希望这篇博客对大家能有帮助🎈🎈 目录 言 一. Redis去重原理 1. Redis Set 数据结构 2. 基于 Set 实现数据去重 3. 代码示例 4. 总结 …

月薪30K-100K,新一波工作机会来了,你准备好了吗

纯血版鸿蒙发布,开启一个新时代 1月18日下午,在“鸿蒙千帆起”发布会上,华为揭秘鸿蒙生态和纯血鸿蒙星河版HarmonyOS NEXT进阶的新进展。“几年来,在众多伙伴和开发者的共同努力下,鸿蒙生态设备数已达8亿,…