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

【JAVA】线程和进程

在这里插入图片描述

🏆今日学习目标:线程和进程
😃创作者:颜颜yan_
✨个人主页:颜颜yan_的个人主页
⏰本期期数:第三期
🎉专栏系列:JAVA


线程和进程

  • 前言
  • 一、进程与线程
    • 1.进程
    • 2.线程
  • 二、线程的创建
    • 2.1 继承Thread类创建多线程
    • 2.2 实现Runnable接口创建多线程
    • 2.3 实现Callable接口创建多线程
    • 总结


前言

多线程是提升程序性能非常重要的一种方式,也是Java 编程中的一项重要技术。在程序设计中,多线程就是指一个应用程序中有多条并发执行的线索,每条线索都被称作—个线程,它们会交替执行,彼此可以通信。


一、进程与线程

1.进程

进程(process) 是计算机中程序的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。

虽然进程在程序执行时产生,但进程并不是程序。程序是“死”的,进程是“活”的。程序是指编译好的二进制文件,它存放在磁盘上,不占用系统资源,是具体的;而进程存在于内存中,占用系统资源,是抽象的。当一次程序执行结束时,进程随之消失,进程所用的资源被系统回收。

对计算机用户而言,计算机似乎能够同时执行多个进程,如听音乐、玩游戏、语音聊天等等,都能在同一台计算机上同时进行。但实际上,一个单核的 CPU 同一时刻只能处理一个进程,用户之所以认为同时会有多个进程在运行,是因为计算机系统采用了多道程序设计技术。

所谓多道程序设计,是指计算机允许多个相互独立的程序同时进人内存,在内存的管理控制之下,相互之间穿插运行。多道程序设计必须有硬件基础作为保障。

采用多道程序设计的系统,会将 CPU 的周期划分为长度相同的时间片,在每个 CPU时间片内只处理一个进程,也就是说,在多个时间片内,系统会让多个进程分时使用 CPU。假如现在内存中只有3个进程A、B、C,那么CPU 时间片的分配情况大致如下图。
在这里插入图片描述

虽然在同一个时问片中,CPU 只能处理一个进程,但 CPU 划分的时间片是非常微小的,且 CPU 运行速度极快(1 秘可执行约10亿条指令),因此,在宏观上并发执行多个程序、处理多个进程。

进程对 CPU 的使用权是由操作系统内核分配的,操作系统内核必须知道内存中有多少个进程,并且知道此时正在使用 CPU 的进程,这就要求内核必须能够区分进程,并可获取进程的相关属性。

2.线程

通过上述节的介绍可以知道,每个运行的程序都是一个进程,在一个进程中还可以有多个执行单元同时运行,这些执行单元可以看作程序执行的线程(thread)。每一个进程中都至少存在一个线程。例如,当一个Java 程序启动时,就会产生一个进程,该进程默认创建一个线程,这个线程会运行main()方法中的代码。

在程序中,代码都是按照调用顺序依次往下执行的,没有出现两段程序代码交替运行的效果,这样的程序称作单线程程序。如果希望程序中实现多段程序代码交替运行的效果,则需要创建多个线程,即多线程程序。所谓多线程是指一个进程在执行过程中可以产生多个线程,这些线程在运行时是相互独立的,它们可以并发执行。多线程程序的执行过程如图 。

图中的多条线程看起来是同时执行的;其实不然,图中多线程程序的执行过程它们和进程一样,也是由 CPU 轮流执行的,只不过 CPU 运行速度很快,因此给人同时执行的感觉。
在这里插入图片描述

二、线程的创建

Java 提供厂3种多线程的创建方式:

(1)继承 java.lang 包中的 Thread 类,重写 Thread 类的run()方法,在run()方法中实
现多线程代码。
(2)实现 java.lang.Runnable 接口,在run()方法中实现多线程代码。
(3)实现 java.util.concurrent.Callable 接口,重写 callO方法,并使用 Future 接口获取call()方法返回的结果。

2.1 继承Thread类创建多线程

Main类

public class Main {public static void main(String[] args) {MyThread1 myThread = new MyThread1();      //创建MyThread1类的实例对象myThread.run();                            //调用Mythread1类的run方法while (true){                             //死循环,输出信息System.out.println("main()方法在运行");}}
}

MyThread1类

public class MyThread1 {public void run(){while (true){                                        //死循环,输出信息System.out.println("MyThread类的run方法在运行");}}
}

运行结果如图:
在这里插入图片描述

从图中可以看出,程序一直打印“My Thread 类的run()方法在运行”,这是因为该程序是一个单线程程序。在第一幅图的代码调用 MyThread1 类的run()方法时,执行第 MyThread1 类代码定义的死循环,因此,MyThread 类的 printin 语句将一直执行,而main()方法中的 printin 语句无法得到执行。

如果希望两个while 循环中的println 语句能够并发执行,就需要实现多线程。为此Java 提供了线程类 Thread。通过继承 Thread 类,并重写 Thread 类中的run()方法,便可实现生线程。在Thread 类中提供了 start()方法用于启动新线程。新线程启动后,Java虚拟机会自动调用 run()方法;如果子类重写了run()方法,便会执行子类中的run()方法。

2.2 实现Runnable接口创建多线程

上面通过继承 Thread 类实现了多线程,但是这种方式有一定的局限性。因为Java 只支持单继承,一个类一旦继承了某个父类,就无法再继承 Thread 类。例如,Studert类继承了Person 类,那么Student 类就无法再通过继承 Thread 类创建线程。

为了克服这种弊端,Thread 类提供了另一个构造方法——Thread (Runnable target),其中参数类型 Runnable 是一个接口,它具有一个run()方法。通过Thread(Runnabiletarget)构造方法创建线程对象时,只需为该方法传递一个实现了 Runnable 接口的对象,这样,创建的线程将实现 Runnable 接口中的run()方法作为运行代码,而不需要调用 Thread类中的run()方法。

下面通过案例演示如何通过实现 Runnable 接口的方式创建多线程,如图所示:

Main类

public class Main {public static void main(String[] args) {MyThread2 myThread2 = new MyThread2();  //创建MyThread2类的实例对象Thread thread = new Thread();    // 创建线程对象thread.start();             //开启线程,执行线程中的run()方法while (true){System.out.println("main()方法在运行");}}
}

MyThread2类

public class MyThread2 implements Runnable{public void run() {              //线程的代码段,当调用start()方法时,线程从此开始执行while (true){System.out.println("MyThread类的run()方法在运行");}}}

在代码中,代码定义的 MyThreado2 类实现了 Runnable 接口,并在中代码中重写了 Runnable 接口中的run()方法。在Main代码通过调用Thread类的构造方法将NyThread2类的实例对象作为参数传入。代码中调用 strar()方法开启新线程执行 MyThread2 关中的代码。而主线程继续执行 main()方法中的代码。

运行结果如图:
在这里插入图片描述
从图中可以看出来,main()和MyThread2类中的run()方法都被执行了,说明实现了多线程

2.3 实现Callable接口创建多线程

通过 Thread 类和 Runnable 接口实现多线程时,需要重写run()方法,但是由于run()f方法没有返回值,无法从新线程中获取返回结果。为了解决这个问题,Java 提供了Callable接口来满足这种既能创建新线程又有返回值的需求。

通过实现 Callable 接口的方式创建并启动线程的主要步骤如下:
(1)创建 Callable 接口的实现类,同时重写 Callable 接口的call()方法。
(2)创建 Callable 接口的实现类对象。
(3)通过线程结果处理类 FutureTask 的有参构造方法封装 Callable 接口的实现类
对象。
(4)调用参数为 FutureTask 类对象的有参构造方法 Thread() 创建 Tbread 线程实例。
(5)调用线程实例的 start()方法启动线程。
下面通过一个案列演示如何通过买现 Callable 接口的方式来实现多线程,如下面文件所示。

Main

import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;public class Main {public static void main(String[] args) throws ExecutionException, InterruptedException {Mythread3 myThread = new Mythread3();  //创建Callable接口类的实例对象//使用FuntureTask封装Mythread3类FutureTask ft1 = new FutureTask(myThread);//使用Thread(Runnable target,String name)构造方法创建线程对象Thread thread1 = new Thread(ft1,"thread");//调用线程对象的start()方法启动线程thread1.start();//通过FuntureTaskdioxin的方法管理返回值System.out.println(Thread.currentThread().getName()+"的返回结果:"+ft1.get());int a=0;while (a++<5){System.out.println("main()方法在运行");}}
}

MyThread3类

import java.util.concurrent.*;
public class Mythread3 implements Callable {//重写Callable接口中的call()方法public Object call() throws Exception{int i=0;while (i++<5){System.out.println(Thread.currentThread().getName()+"的call()方法在运行");}return i;}
}

在上述文件中,在MyThread3类代码定义了一个实现 Callable 接口的实现类,并在 Calalble接口中重写了call()方法。在Main中,代码创建了 Callable接口的实例,并调用有参的Thread()构造方法创建了线程对象thread1。在代码中调用线程对象 thread1的 start()方法启动线程。

运行结果如图所示:
在这里插入图片描述
从图可以看出,所示的案例通过实现 Callable 接口的方式实现了多线程开且有返回结果。

Callable 接口方式实现的多线程是通过 Future Task 类来封装和管理返回结果的,Future Task 类的直接父接口是RunnableFuture,从名称上可以看出 RunnableFuture 是Runnable 和Future的结合体。

总结

以上就是今天的学习内容啦~
如果有兴趣的话可以订阅专栏,持续更新呢~
咱们下期再见~
在这里插入图片描述

相关文章:

【JAVA】线程和进程

&#x1f3c6;今日学习目标&#xff1a;线程和进程 &#x1f603;创作者&#xff1a;颜颜yan_ ✨个人主页&#xff1a;颜颜yan_的个人主页 ⏰本期期数&#xff1a;第三期 &#x1f389;专栏系列&#xff1a;JAVA 线程和进程前言一、进程与线程1.进程2.线程二、线程的创建2.1 继…...

移动app安全测试工具好物分享

移动互联网时代&#xff0c;我们的生活和工作深受移动app的影响。随着移动app的广泛应用&#xff0c;安全问题成为人们最关注的话题之一。移动app安全除了和软件开发密不可分之外&#xff0c;软件测试的作用也是不容忽视的。移动app安全测试是指测试人员利用各种测试手段验证Ap…...

原生微信小程序引入npm和安装Vant Weapp

目录一、引入npm安装Vant Weapp1、引入npm2、安装Vant Weapp3、修改 app.json4、修改 project.config.json二、构建npm一、引入npm安装Vant Weapp 环境&#xff1a;Windows10 开发工具&#xff1a;微信开发者工具 本地环境&#xff1a;已安装过node.js 1、引入npm cmd进入到你…...

ChatGPT文章自动发布WordPress

WordPress可以用ChatGPT发文章吗&#xff1f;答案是肯定的&#xff0c;ChatGPT官方有提供api接口&#xff0c;多以目前有很多的SEO工具具有自动文章生成自动发布的功能&#xff0c;使用SEO工具&#xff0c;我们可以通过疑问词和关键词进行文章生成&#xff0c;并定时发布到我们…...

vue项目使用watch监听器监听数据变化

vue项目使用watch监听器监听数据变化 1.概述 在开发项目中&#xff0c;有些场景是当用户点击某个按钮后改变某个属性的值&#xff0c;这个值改变时需要触发事件做一些事情。属性值什么时候改变是没法提前判断的&#xff0c;因此需要有个监听的角色&#xff0c;当监听到值改变…...

动态规划(背包问题)

动态规划 文章目录动态规划一、背包问题一、01背包二、完全背包问题三、多重背包问题四、分组背包问题一、背包问题 一、01背包 有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。 第 i 件物品的体积是 vi&#xff0c;价值是 wi。 求解将哪些物品装入背包&#xf…...

04741自考计算机网络原理最详细汇总

04741自考计算机网络原理知识点总结 引言 第一章 计算机网络概述 1.计算机网络基本概念与网络结构 1.1 计算机网络的概念; 1.2 计算机网络结构 1.3 数据交换技术 1.4 计算机网络性能 1.5 计算机网络体系结构 1.6 计算机网络与因特网发展简史 第二章 网络应用 2.1 网络应用体系…...

MySQL 入门学习笔记(二) 基本操作

MySQL 入门学习笔记(二) 数据库和表的基本操作 我们把一些表的集合称之为数据库,一个服务器中可以存在多个数据库.每个数据库中包含多个表,每个表都有一个名字作为标识,数据表则包含带有数据的记录. PS:SQL 语句对大小写不敏感. 操作数据库命令 在 MySQL 命令中,数据库用DAT…...

【Linux】理解文件系统

文章目录理解文件系统了解磁盘结构inode理解文件系统 了解磁盘结构 磁盘是计算机中的一个 机械设备 这个磁盘的盘片就像光盘一样,数据就在盘片上放着, 但是光盘是只读的,磁盘是可读可写的 机械硬盘的寻址的工作方式: 盘片不断旋转,磁头不断摆动,定位到特定的位置 我们可以把…...

Java如何String字符串带括号转成List

问题现象 今天在做一个需求&#xff1a;将存入数据库中的数据读到后解析成list遍历分析 数据格式&#xff1a; "[1677660600000, 1677660900000, 1677661200000]" "[5, 4, 4,3,2&#xff0c;0,0]" 我一开始想到的就是使用逗号分割即可 结果变成了这样的…...

react 使用 mqtt

也许很多人都好奇这个mqtt是什么东西&#xff0c;其实在互联网上可能不会使用到它&#xff0c;它是物联网上的东西&#xff0c;也是一种通信协议跟websocket。但它也能在浏览器跟服务器上跑&#xff0c;它的底层实现也是封装了websocket。 MQTT MQTT是一个客户端服务端架构的发…...

W25Q256被写保护如何修改

W25Q256被写保护如何修改1、 W25Q256数据读不到1.1 打印的寄存器的值1.2 可能原因1.3 解决办法1.4 用到的函数1、 W25Q256数据读不到 能够正确的读到ID&#xff0c;但是读到的数据不正确 1.1 打印的寄存器的值 0x2 BUSY &#xff1a;只读&#xff0c; 指令正在执行 WEL (1) &…...

论文投稿指南——中文核心期刊推荐(中国文学作品)

【前言】 &#x1f680; 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊 &#x1f384; 在期刊论文的分布中&#xff0c;存在一种普遍现象&#xff1a;即对于某一特定的学科或专业来说&#xff0c;少数期刊所含…...

MySQL 问题总结

什么是MVCC&#xff1f; 说说MySQL实现MVCC的原理&#xff1f; MVCC&#xff0c;全称Multi-Version Concurrency Control&#xff0c;即多版本并发控制。MVCC是一种并发控制的方法&#xff0c;一般在数据库管理系统中&#xff0c;实现对数据库的并发访问。 对于「读已提交」和…...

62. 不同路径

62. 不同路径 一个机器人位于一个 m∗nm * nm∗n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。 问总共有多少条不同的路…...

在windows安装python3.11同时进行一个数据的练习

安装包百度网盘如下&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1l9H1GWP64LOxLaXXLie2uA?pwd6666 提取码&#xff1a;6666 1.我们选择自定义安装 2.当我们点了自定义安装后就直接next 3.修改路径&#xff0c;之后点击安装(install) 4.安装完成&#xff0c;进行…...

Java接口专题

基本介绍 接口给出一些没有实现的方法&#xff0c;封装到一起&#xff0c;到某个类使用时再根据具体情况把这些方法写出来。 注意&#xff1a;在jdk7之前&#xff0c;接口里所有的方法都是抽象方法。在jdk8之后接口中可以有静态方法&#xff0c;默认方法 interface 接口名{/…...

6招优化WordPress打开速度-让你的网站飞起来

为什么我们的WordPress网站比你的快&#xff1f; 我们的官网是使用WordPress框架搭建的&#xff0c;有没有发现我们的网站非常快&#xff0c;而你的WordPress网站比较慢呢&#xff1f;那是因为我们的网站经过了优化。 WordPress 很慢&#xff1f; 为什么很多人都会觉得 Word…...

春天到了,来一场 VoxEdit 创作大赛吧!

春天的气息扑面而来&#xff0c;这是让你尽情绽放创造力的最佳时机&#xff01;我们将以「春天」为主题来一场 VoxEdit 大赛。在这里&#xff0c;你可以展示你的才华并赢得 $SAND 奖励&#xff01; 无论你是专业的设计师&#xff0c;还是仅仅喜欢创造美丽的艺术&#xff0c;这场…...

异步Buck和同步Buck的特点

1 介绍 随着时代的发展&#xff0c;工业&#xff0c;车载&#xff0c;通信&#xff0c;消费类等产品都提出了小型化&#xff0c;智能化的需求。相应的&#xff0c;对于这些系统中的电源模块提出了小型化的要求。目前&#xff0c;市场上依然存在很多异步Buck电源管理芯片使用的场…...

基于轻量级YOLO开发构建中国象棋目标检测识别分析系统

关于棋类相关的项目在我之前的博文里面都有做过&#xff0c;如下&#xff1a;《yolov5s融合SPD-Conv用于提升小目标和低分辨率图像检测性能实践五子棋检测识别》《YOLOV5融合SE注意力机制和SwinTransformer模块开发实践的中国象棋检测识别分析系统》《基于yolov5s实践国际象棋目…...

机器学习100天(三十五):035 贝叶斯公式

《机器学习100天》完整目录:目录 机器学习100天,今天讲的是:贝叶斯公式! 好了,上一节介绍完先验概率、后验概率、联合概率、全概率后,我们来看这样一个问题:如果我现在挑到了一个瓜蒂脱落的瓜,则该瓜是好瓜的概率多大? 显然,这是一个计算后验概率的问题,根据我们之…...

大话数据结构-栈

1 概述 栈&#xff08;Stack&#xff09;是限定仅在表尾进行插入和删除操作的线性表。 允许插入和删除的一端称为栈顶&#xff08;top&#xff09;&#xff0c;另一端称为栈底&#xff08;bottom&#xff09;&#xff0c;不含任何数据元素的栈称为空栈&#xff0c;栈又称为后进…...

javaFx实现放大镜效果——圆形、矩形、三角形放大镜,拖动调整放大镜大小,设置放大倍数

系列文章专栏:javafx图形绘制、桌面录屏录音源码合集 目录 一、实现的效果 二、实现思路 三、程序实现...

什么是客户忠诚度?建立忠诚文化的 5 种方法

客户忠诚度影响企业的各个方面&#xff0c;例如收入、品牌形象、预算分配和产品路线图。拥有忠实的客户群对于建立成功的企业至关重要&#xff0c;因为您的客户是您的主要拥护者&#xff0c;有助于为您的企业营造积极的氛围。 什么是客户忠诚度&#xff1f; 客户忠诚度衡量客户…...

【ROS2知识】关于colcon编译和ament指定

一、说明 这里说说编译和包生成的操作要点&#xff0c;以python包为例。对于初学者来说&#xff0c;colcon和ament需要概念上搞清楚&#xff0c;与此同时&#xff0c;工作空间、包、节点在一个工程中需要熟练掌握。本文以humble版的ROS2&#xff0c;进行python编程的实现。 二、…...

数据结构: 最小栈

最小栈的特色是保持栈后进先出的特性&#xff0c;同时能够以O(1)复杂度获得当前栈的最小值。 栈是比较好实现的&#xff0c;直接搞个链表&#xff0c;从头部删除和添加即可。 最小栈的核心逻辑是&#xff1a; 因为栈是后进先出的&#xff0c;因此栈顶元素之下的数字永远在栈…...

STM32之PWM

PWMPWM&#xff0c;英文名Pulse Width Modulation&#xff0c;是脉冲宽度调制缩写&#xff0c;它是通过对一系列脉冲的宽度进行调制&#xff0c;等效出所需要的波形&#xff08;包含形状以及幅值&#xff09;&#xff0c;对模拟信号电平进行数字编码&#xff0c;也就是说通过调…...

操作系统(1.1)--引论

目录 一、操作系统的目标和作用 1.操作系统的目标 2.操作系统的作用 2.1 OS作为用户与计算机硬件系统之间的接口 2.2 OS作为计算机系统资源的管理者 2.3 0S实现了对计算机资源的抽象 3. 推动操作系统发展的主要动力 二、操作系统的发展过程 1.无操作系统的计算机系统…...

Spring boot + mybatis-plus 遇到 数据库字段 创建不规范 大驼峰 下划线 导致前端传参数 后端收不到参数 解决方案

最近使用springboot 连接了一个 sqlserver 数据库 由于数据库年数久远 &#xff0c;建表字段不规范 大驼峰 下划线的字段名都有 但是 java 中 Spring boot mybatis-plus 又严格按照小驼峰 格式 生成实体类 如果不是小驼峰格式 Data 注解 get set 方法 在前端请求参数 使用这个…...

828企业服务平台/海阳seo排名

最新国家开放大学电大本科网考机考形考《计算机应用基础》单选题题库完整版最新国家开放大学电大本科网考机考形考《计算机应用基础》单选题题库完整版100%能过这是本人经过多年研究总结出来的会计本科《计算机基础知识》单选题题库&#xff0c;在试卷中占40分。在考前可把这套…...

wordpress tag 排序/网店运营流程步骤

文章目录函数式编程foreach遍历简化函数定义映射&#xff08;map&#xff09;扁平化映射&#xff08;flatMap&#xff09;过滤&#xff08;filter&#xff09;排序sorted&#xff08;默认排序&#xff09;sortBy&#xff08;指定字段排序&#xff09;sortWith&#xff08;自定义…...

求个靠谱的网站/怎么制作网页链接

在中国&#xff0c;如果是IT工程师&#xff0c;有工作经验很受企业青睐&#xff0c;这也是很多人参加IT培训的原因&#xff0c;尤其是Java开发工程师都喜欢参加培训机构&#xff0c;他们参加Java培训班好就业吗&#xff1f;待遇怎么样&#xff1f; Java开发是高端职业&#xf…...

公司网站背景图片/推广方案应该有哪些方面

当今时代&#xff0c;在全球竞争激烈的大市场中&#xff0c;无论是流程式还是离散式的制造业&#xff0c;无论是单件生产、多品种小批量生产、少品种重复生产还是标准产品大量生产的制造&#xff1b;制造业内部管理都可能遇到以下一些问题&#xff1a;如企业可能拥有卓越的销售…...

装修材料/seo公司推荐

举个例子吧 现在的静态网页&#xff0c;有很多都会插入百度地图&#xff0c;特别是商家&#xff0c;或是企业站 例如 点击查看百度地图 便会进入这个网页中 也可以直接嵌入网页中&#xff0c;把地图的html代码&#xff0c;放入一个div中 下面步入正题&#xff0c;看看怎么来获取…...

学校网站建设方案论文/网站权重是什么意思

我们不常用但是比较实用的SHELL脚本&#xff1a;1、apt-get install sl 这时候忘记了sudo &#xff0c;那么只要执行sudo !!&#xff0c;!!表示上一条命令2、vi hello.c 退出后&#xff0c;如果想打开刚才的hello.c文件&#xff0c;只需要!vi3、man ascii 来查看ascii码表4、ec…...