多线程 01:Java 多线程学习导航,线程简介,线程相关概念的整理

news2024/9/24 20:30:19

一、概述

记录时间 [20240807] 立秋 & 128 创作纪念日

本文是关于 Java 多线程学习的导航篇,总览了有关多线程学习的几个模块。简单介绍了一些与线程相关的基本概念,便于后续展开多线程的学习。

前置知识:Java 基础篇;Java 面向对象

Java 多线程学习主要模块包括:线程简介;线程实现;线程状态;线程同步;线程通信问题;拓展高级主题。


关于创作纪念日

里程碑专区

是生命中平常的午后,也是留给未来的礼物。

一切尽在不言中,那就写文章纪念一下吧。

愿所见者心想事成。


二、多任务 / 多线程

多任务(Multitasking)是指操作系统能够同时处理多个任务的能力。

  • 在计算机科学中,多任务可以指不同的层面;
  • 但在日常使用中,它通常指的是操作系统能够使用户感觉多个应用程序同时运行的能力

多线程(Multithreading)是指在一个进程中同时运行多个线程的能力。


1. 多任务的类型

单处理器多任务

  • 在单个处理器上模拟多个任务同时运行。
  • 实际上,处理器在各个任务间快速切换,使得每个任务都获得一定的时间片来执行。
  • 用户感觉好像多个应用程序都在同时运行。

多处理器多任务

  • 当系统有多个处理器时,可以真正实现多个任务同时运行在不同的处理器上。
  • 这种方式下,真正的并行处理成为可能,从而提高了系统的整体性能。

2. 多任务的示例

假设一个用户正在使用电脑编辑文档,同时下载文件,并且还有一个音乐播放器在后台播放音乐。

在这种情况下,操作系统会为每个应用程序分配一定的处理器时间,并确保它们都能正常运行。

虽然实际上每次只有一个应用程序直接使用处理器,但由于时间分片技术,用户会感觉到所有应用程序都在同时运行

在现代操作系统中,多任务几乎是标配,无论是桌面操作系统还是移动操作系统,都支持多任务处理。这使得用户能够高效地执行多个任务,提高了生产力和娱乐体验。


3. 线程与多线程

线程

  • 线程是进程中的一个执行单元,是进程内部的一个轻量级进程。
  • 线程是操作系统能够进行运算调度的最小单位。
  • 线程共享所属进程的资源,如内存空间、文件句柄等。

多线程

  • 多线程允许在一个进程中同时执行多个线程。

  • 这些线程可以并行执行,提高程序的执行效率和响应速度。


三、调用方式

如图,普通方法调用和多线程是两种不同的执行模式。

  • 在普通方法调用中,程序按照顺序执行;
  • 在多线程环境中,程序可以在同一时间内并发执行多个任务。

在这里插入图片描述

下面是这两种执行模式的详细对比:

1. 普通方法调用

  • 顺序执行
    • 普通方法调用意味着程序中的方法按顺序执行,一个方法调用完成后才会执行下一个方法
    • 这种执行模式适用于不需要并发执行的任务。
  • 单线程执行
    • 在单线程环境中,整个程序在同一时间只能执行一个任务。
    • 即使程序中有多个方法,它们也是依次执行的。
  • 资源独占
    • 当一个方法正在执行时,其他方法无法访问正在使用的资源,直到当前方法执行完毕。
    • 这有助于简化资源管理和避免并发问题。
  • 调用栈
    • 每当一个方法被调用时,都会在调用栈上创建一个新的栈帧。
    • 当方法返回时,对应的栈帧被弹出,控制权回到调用者。

2. 多线程

  • 并发执行
    • 多线程允许一个程序在同一时间内执行多个任务
    • 每个任务(线程)可以独立于其他线程执行。
  • 资源共享
    • 线程共享同一进程的资源,如内存、文件句柄等。
    • 因此,线程间可以很容易地共享数据和资源。
  • 线程调度
    • 操作系统负责调度线程,决定哪个线程在给定时刻获得 CPU 时间。
    • 线程调度可以基于时间片轮转、优先级等策略。
  • 线程同步
    • 为了防止多个线程同时访问同一资源导致的问题,需要使用同步机制。
    • 常见的同步机制包括锁(Locks)、信号量(Semaphores)、条件变量(Condition Variables)等。
  • 线程间通信 (IPC)
    • 线程间通信允许线程间共享数据和同步状态。
    • 通常使用共享内存区域、消息队列等方式实现。

3. 示例对比

对于普通方法

假设有一个简单的程序,它按顺序调用两个方法 methodAmethodB

public class SequentialExample {

    public static void methodA() {
        System.out.println("Method A started");
        try {
            Thread.sleep(1000); // 模拟耗时操作
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("Method A finished");
    }

    public static void methodB() {
        System.out.println("Method B started");
        try {
            Thread.sleep(1000); // 模拟耗时操作
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("Method B finished");
    }

    // 主程序
    public static void main(String[] args) {
        methodA();
        methodB();
    }
}

从主程序中可以看出,methodA 方法先于 methodB 方法被调用。

得到结果为:

Method A started
Method A finished
Method B started
Method B finished

对于多线程

同样的方法 methodAmethodB,如果采用多线程的方式运行。

  • 先创建线程 threadA 调用 methodA;再创建线程 threadB 调用 methodB
  • 两个线程同时运行,输出结果不确定且不唯一。
public class MultithreadingExample {

    public static void methodA() {
        System.out.println("Method A started");
        try {
            Thread.sleep(1000); // 模拟耗时操作
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("Method A finished");
    }

    public static void methodB() {
        System.out.println("Method B started");
        try {
            Thread.sleep(1000); // 模拟耗时操作
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("Method B finished");
    }

    public static void main(String[] args) {
        Thread threadA = new Thread(MultithreadingExample::methodA);
        Thread threadB = new Thread(MultithreadingExample::methodB);

        threadA.start();
        threadB.start();
    }
}

四、程序 / 进程 / 线程

程序、进程和线程是计算机科学中的三个基本概念,它们之间有着紧密的关系,构成了现代操作系统中程序执行的基础结构。

程序是静态的指令集合,进程是程序的一次执行实例,而线程是进程中的执行单元。

1. 程序 (Program)

  • 定义
    • 程序是一组有序的指令集合,用来描述计算机执行特定任务的步骤。
    • 程序通常是指源代码经过编译后生成的可执行文件或脚本。
  • 特点
    • 程序本身不能直接运行,需要加载到内存中并由操作系统启动。
    • 一个程序可以包含多个文件和资源,如库文件、配置文件等。
  • 示例
    • 编译后的 .exe 文件(Windows)或 .sh 脚本(Unix/Linux)。

2. 进程 (Process)

  • 定义
    • 进程是一个程序的一次执行实例。
    • 进程是操作系统进行资源分配和调度的基本单位。
  • 特点
    • 每个进程都有自己的独立内存空间、文件描述符表和环境变量。
    • 进程之间通过进程间通信 (IPC) 进行通信和同步。
  • 状态
    • 进程在其生命周期中有多种状态,包括新建、就绪、运行、阻塞和终止。
  • 示例
    • 打开一个浏览器,启动一个文本编辑器,运行一个游戏等。

3. 线程 (Thread)

  • 定义
    • 线程是进程中的一个执行单元,是操作系统能够进行运算调度的最小单位。
    • 线程是 CPU 调度和执行的单位。
    • 线程共享所属进程的资源,如内存空间、文件句柄等。
  • 特点
    • 线程之间的通信简单,因为它们共享同一进程的地址空间。
    • 创建和销毁线程的成本低于进程。
    • 线程间切换的开销较小。
  • 状态
    • 线程也有多种状态,包括新建、就绪、运行、阻塞和终止。
  • 示例
    • 在一个浏览器进程中,可能有多个线程,一个用于处理用户界面,另一个用于处理网络请求。

4. 关系和区别

程序与进程

  • 程序是静态的,而进程是动态的。
  • 一个程序可以对应多个进程,每个进程都是程序的一个执行实例。

进程与线程

  • 进程是资源分配的基本单位,而线程是调度的基本单位。
  • 同一进程中的线程共享进程的资源,而不同进程之间的资源是隔离的。
  • 创建和销毁进程的开销大于线程。
  • 一个进程可以有多个线程,如观看视频时,同时听声音,看图像,看弹幕,等等。

五、核心概念

  • 线程是独立的执行路径。
  • 在程序运行时,即使没有显式创建线程,后台也会存在多个线程,例如主线程和垃圾回收 (gc) 线程。
  • main()主线程,是系统的入口,用于执行整个程序。
  • 在一个进程中,如果创建了多个线程,那么这些线程的运行是由调度器负责安排的。调度器与操作系统紧密相关,并且线程的执行顺序通常是不可人为干预的。
  • 同一份资源操作时,会存在资源抢夺的问题,需要加入并发控制。
  • 线程会带来额外的开销,如 CPU 调度时间,以及并发控制开销。
  • 每个线程都在自己的工作内存中进行交互,如果内存控制不当,可能会导致数据不一致的问题。

六、参考资料

狂神说 Java 多线程:https://www.bilibili.com/video/BV1V4411p7EF
TIOBE 编程语言走势: https://www.tiobe.com/tiobe-index/
Typora 官网:https://www.typoraio.cn/
Oracle 官网:https://www.oracle.com/
Notepad++ 下载地址:https://notepad-plus.en.softonic.com/
IDEA 官网:https://www.jetbrains.com.cn/idea/
Java 开发手册:https://developer.aliyun.com/ebook/394
Java 8 帮助文档:https://docs.oracle.com/javase/8/docs/api/

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

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

相关文章

腾讯云AI代码助手的实用性能以及带给开发者的便捷开发陪伴

腾讯云AI代码助手的实用性能以及带给开发者的便捷开发陪伴 前言一、开发环境介绍二、腾讯云AI代码助手使用实例1 一键代码补全2 与腾讯云ai代码助手对话3 直接对源码进行注释,查错 三 获得的帮助与提升四 对腾讯云AI代码助手的建议总结 前言 在日常的编程工作的生活…

SQL报错注入之updatexml

目录 1.updatexml报错原理 2.判断是否有注入点 我们在地址栏中输入?id1 我们在地址栏中输入?id1-- 3.updatexml报错注入 3.1爆库名 3.2爆表名 3.3爆字段名 3.4爆数据 1.updatexml报错原理 updatexml(xml_doument,XPath_string,new_value) 第一个参数:XML…

07-软件参数的基本配置

1.设置交叉 2.Design insight 关闭 3.数据保存设置 4.原理图设置 5.PCB-General设置 PCB-Board Insight Modes设置 PCB-Board Insight Color Overrides PCB-DRC Violations Display PCB-Interactive Routing PCB-Defaults

【C++】C++11的新特性 — 线程库 ,原子操作 , 条件变量

勇敢就是接受发生在你身上的事,并把它尽力做到最好。 -- 约翰・欧文 -- C11的新特性 1 线程1.1 线程概念1.2 C中的线程1.3 线程并行1.4 锁 2 原子操作3 条件变量Thanks♪(・ω・)ノ谢谢阅读!!!下…

最短路问题中的bellman-ford算法

最短路问题中的bellman-ford算法 题目 如果要处理单源最短路问题当中存在负权边的,那么就需要用到 bellman-ford算法和SPFA算法,一般情况下都是用 SPFA算法,除了有边数限制的情况只能用bellman-ford算法,比如下面这种 题目 给定…

SVG入门指南

前言 SVG 是一种使用 XML 描述 2D 图形的语言&#xff0c;与传统前端 DOM 开发比较类似&#xff0c;本文尝试总结一下 SVG 的基本用法。 基本图形绘制 与 canvas 不同&#xff0c;svg 使用声明式的方式来绘制图形&#xff0c;比如绘制一个矩形&#xff1a; <svg width&q…

Elastic 利用由 Search AI 提供支持的自动导入功能加速 SIEM 数据导入

作者&#xff1a;来自 Elastic Jamie Hynds, Mark Settle Elastic 正在通过自动导入功能自动完成 SIEM 数据导入&#xff0c;从而加速采用 AI 驱动的安全分析。这项新功能&#xff08;安全分析或 SIEM 解决方案中独一无二的功能&#xff09;可自动开发自定义数据集成。Elastic …

轻松上手MYSQL:掌握MYSQL聚合函数,数据分析不再难

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》《MYSQL》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 ✨欢迎加入探索MYSQL聚合函数之旅✨ &#x1f44b; 大家好&#xff01;文本学习和探…

240807-Gradio客户端GUI与服务端API分离代码示例

A. 客户端服务端分离的最终效果 B. 前后端核心代码 Gradio支持将前端界面&#xff08;客户端&#xff09;与后端逻辑&#xff08;服务端&#xff09;分离。通过这种方式&#xff0c;客户端负责用户交互和显示&#xff0c;而服务端负责实际的数据处理和功能实现。 以下是如何实…

买Zoho企业邮箱赠公司后缀的域名吗?

随着市场上企业邮箱服务提供商的增多&#xff0c;选择适合自身需求的服务变得尤为重要。其中一个常见的问题是&#xff1a;购买Zoho企业邮箱服务时是否会赠送公司后缀的域名&#xff1f;赠送域名有哪些套路&#xff1f;本文将详细探讨这些问题。 一、买Zoho企业邮箱赠送公司后…

让三岁小孩都能理解动态规划_来自B站罐装-蜜糖

系列文章目录 文章目录 系列文章目录一、认识算法动态规划难在哪?学习目标 二、记忆化搜索 非常直觉的处理方式注意&#xff1a; 三、70.爬楼梯 入门 模板通过记忆化搜索 发现动态规划四要素 四、118.杨辉三角 使用答案空间处理&#xff08;题目给了返回值的样式&#xff09;五…

The Ether: EvilScience (v1.0.1)打靶渗透【附代码】(权限提升)

靶机下载地址: https://www.vulnhub.com/entry/the-ether-evilscience-v101,212/ 1. 主机发现端口扫描目录扫描敏感信息获取 1.1. 主机发现 nmap -sn 192.168.7.0/24|grep -B 2 00:0C:29:7F:50:FB 1.2. 端口扫描 nmap -p- 192.168.7.172 1.3. 目录扫描 dirb http://192.16…

vm虚拟机下安装CentOS7系统

VMware16安装CentOS7 1.启动之前安装的VM 具体VMware安装过程 2.配置Linux&#xff08;centos7&#xff09;的镜像文件 选择安装镜像文件 4.开启虚拟机 开始读秒安装 选择安装过程中使用的语言&#xff0c;这里选择英文、键盘选择美式键盘。点击Continue 首先设置时间…

MySQL——数据类型、索引的建立、数据的约束

文章目录 数据类型索引的建立普通索引唯一索引使用ALTER 命令添加和删除索引使用ALTER 命令添加和删除主键显示索引信息 数据的约束非空约束&#xff1a;not null&#xff0c;值不能为null唯一约束&#xff1a;unique&#xff0c;值不能重复主键约束&#xff1a;primary key外键…

【实现100个unity特效之15】最简单的方法使用shader graphs实现2d非像素和像素树叶草的随风摇摆效果

文章目录 前言非像素树叶草飘动效果新建材质效果像素树叶草飘动效果参考完结 前言 本文只是实现一个简单版本的2d树叶草随风摇摆的效果&#xff0c;如果你想要实现更加复杂的效果&#xff0c;包括2d互动草&#xff0c;你可以参考我之前的文章&#xff1a; 【推荐100个unity插件…

基元检测-霍夫直线变换原理

在之前已经使用过正规方程法、梯度下降法拟合直线 1、回顾过去 梯度下降法拟合一元函数 最小二乘法的线性代数推导 现在使用一种新的直线检测方法&#xff0c;霍夫变换&#xff0c;它也可以拟合直线&#xff0c;接下里将说明他的原理。 2、霍夫变换 霍夫变换&#xff08;…

工地安全巡检系统

在建筑施工行业&#xff0c;安全始终是高悬的“达摩克利斯之剑”。随着科技的日新月异&#xff0c;工地安全二维码巡检系统崭露头角&#xff0c;成为守护工地安全的强大利器。 通过凡尔码平台&#xff0c;工地安全巡检系统融合了先进信息技术与安全管理理念的创新成果。其功能丰…

免费的录屏软件有哪些?试试这4款巨好用的录屏软件

4个免费简单实用的录屏软件推荐&#xff0c;帮你解决录屏问题。 1、转转大师录屏软件 下载链接>>screencap.55.la 这是一款非会员录屏也不限制时长的免费录屏软件&#xff0c;操作简单&#xff0c;第一次用就会&#xff0c;必须五星推荐给你&#xff01; 支持多种录制模…

数据结构——排序(1):插入排序

目录 一、排序的概念 二、排列的运用 三、常见的排序算法 四、插入排序 1.直接插入排序 &#xff08;1&#xff09;思路 &#xff08;2&#xff09;过程图示 &#xff08;3&#xff09;代码实现 (4)代码解释 &#xff08;5&#xff09;特性 2.希尔排序 &#xff08;1…

【Java算法专场】位运算(上)

目录 常见位运算总结 位1的个数 算法思路 算法代码 比特位计数 算法思路 算法代码 汉明距离 算法思路 算法代码 只出现一次的数字 算法思路 算法代码 丢失的数字 算法思路 算法代码 常见位运算总结 了解位运算的一些基本操作&#xff0c;那么我们就来通过题目来…