【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】线程和进程
🏆今日学习目标:线程和进程 😃创作者:颜颜yan_ ✨个人主页:颜颜yan_的个人主页 ⏰本期期数:第三期 🎉专栏系列:JAVA 线程和进程前言一、进程与线程1.进程2.线程二、线程的创建2.1 继…...
移动app安全测试工具好物分享
移动互联网时代,我们的生活和工作深受移动app的影响。随着移动app的广泛应用,安全问题成为人们最关注的话题之一。移动app安全除了和软件开发密不可分之外,软件测试的作用也是不容忽视的。移动app安全测试是指测试人员利用各种测试手段验证Ap…...
原生微信小程序引入npm和安装Vant Weapp
目录一、引入npm安装Vant Weapp1、引入npm2、安装Vant Weapp3、修改 app.json4、修改 project.config.json二、构建npm一、引入npm安装Vant Weapp 环境:Windows10 开发工具:微信开发者工具 本地环境:已安装过node.js 1、引入npm cmd进入到你…...
ChatGPT文章自动发布WordPress
WordPress可以用ChatGPT发文章吗?答案是肯定的,ChatGPT官方有提供api接口,多以目前有很多的SEO工具具有自动文章生成自动发布的功能,使用SEO工具,我们可以通过疑问词和关键词进行文章生成,并定时发布到我们…...
vue项目使用watch监听器监听数据变化
vue项目使用watch监听器监听数据变化 1.概述 在开发项目中,有些场景是当用户点击某个按钮后改变某个属性的值,这个值改变时需要触发事件做一些事情。属性值什么时候改变是没法提前判断的,因此需要有个监听的角色,当监听到值改变…...
动态规划(背包问题)
动态规划 文章目录动态规划一、背包问题一、01背包二、完全背包问题三、多重背包问题四、分组背包问题一、背包问题 一、01背包 有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。 第 i 件物品的体积是 vi,价值是 wi。 求解将哪些物品装入背包…...
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
问题现象 今天在做一个需求:将存入数据库中的数据读到后解析成list遍历分析 数据格式: "[1677660600000, 1677660900000, 1677661200000]" "[5, 4, 4,3,2,0,0]" 我一开始想到的就是使用逗号分割即可 结果变成了这样的…...
react 使用 mqtt
也许很多人都好奇这个mqtt是什么东西,其实在互联网上可能不会使用到它,它是物联网上的东西,也是一种通信协议跟websocket。但它也能在浏览器跟服务器上跑,它的底层实现也是封装了websocket。 MQTT MQTT是一个客户端服务端架构的发…...
W25Q256被写保护如何修改
W25Q256被写保护如何修改1、 W25Q256数据读不到1.1 打印的寄存器的值1.2 可能原因1.3 解决办法1.4 用到的函数1、 W25Q256数据读不到 能够正确的读到ID,但是读到的数据不正确 1.1 打印的寄存器的值 0x2 BUSY :只读, 指令正在执行 WEL (1) &…...
论文投稿指南——中文核心期刊推荐(中国文学作品)
【前言】 🚀 想发论文怎么办?手把手教你论文如何投稿!那么,首先要搞懂投稿目标——论文期刊 🎄 在期刊论文的分布中,存在一种普遍现象:即对于某一特定的学科或专业来说,少数期刊所含…...
MySQL 问题总结
什么是MVCC? 说说MySQL实现MVCC的原理? MVCC,全称Multi-Version Concurrency Control,即多版本并发控制。MVCC是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问。 对于「读已提交」和…...
62. 不同路径
62. 不同路径 一个机器人位于一个 m∗nm * nm∗n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。 问总共有多少条不同的路…...
在windows安装python3.11同时进行一个数据的练习
安装包百度网盘如下: 链接:https://pan.baidu.com/s/1l9H1GWP64LOxLaXXLie2uA?pwd6666 提取码:6666 1.我们选择自定义安装 2.当我们点了自定义安装后就直接next 3.修改路径,之后点击安装(install) 4.安装完成,进行…...
Java接口专题
基本介绍 接口给出一些没有实现的方法,封装到一起,到某个类使用时再根据具体情况把这些方法写出来。 注意:在jdk7之前,接口里所有的方法都是抽象方法。在jdk8之后接口中可以有静态方法,默认方法 interface 接口名{/…...
6招优化WordPress打开速度-让你的网站飞起来
为什么我们的WordPress网站比你的快? 我们的官网是使用WordPress框架搭建的,有没有发现我们的网站非常快,而你的WordPress网站比较慢呢?那是因为我们的网站经过了优化。 WordPress 很慢? 为什么很多人都会觉得 Word…...
春天到了,来一场 VoxEdit 创作大赛吧!
春天的气息扑面而来,这是让你尽情绽放创造力的最佳时机!我们将以「春天」为主题来一场 VoxEdit 大赛。在这里,你可以展示你的才华并赢得 $SAND 奖励! 无论你是专业的设计师,还是仅仅喜欢创造美丽的艺术,这场…...
异步Buck和同步Buck的特点
1 介绍 随着时代的发展,工业,车载,通信,消费类等产品都提出了小型化,智能化的需求。相应的,对于这些系统中的电源模块提出了小型化的要求。目前,市场上依然存在很多异步Buck电源管理芯片使用的场…...
Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...
