Java中的多线程编程(超详细总结)

article/2025/9/16 5:14:23

文章目录

    • Java中的多线程编程(超详细总结)
    • 一、线程与多线程的概念
    • 二、线程与进程之间的关系
    • 三、一个线程的生命周期
    • 四、多线程的目的和意义
    • 五、线程的实现的方式

Java中的多线程编程(超详细总结)

一、线程与多线程的概念

线程,即单线程,是程序的一条执行线索,执行路径,是程序使用cpu的最小单位。线程本身不能运行,它只能运行在程序中,线程是依赖于程序存在的。

多线程,从字面上理解,就是从多个单线程一起执行多个任务。在Java 编程中,已经给多线程编程提供了内置的支持。多线程是多任务的一种特别的形式,但多线程使用了更小的cpu资源开销。 多线程能满足程序员编写高效率的程序来达到充分利用 CPU 的目的。

二、线程与进程之间的关系

进程: 一个进程包括由操作系统分配的内存空间,包含一个或多个线程。一个线程不能独立的存在,它必须是进程的一部分。一个进程一直运行,直到所有的非守护线程都结束运行后才能结束。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

① 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,即进程空间或(虚空间)。进程不依赖于线程而独立存在,一个进程中可以启动多个线程。比如在Windows系统中,一个运行的exe就是一个进程。

② 线程是指进程中的一个执行流程,一个进程中可以运行多个线程。比如java.exe进程中可以运行很多线程。线程总是属于某个进程,线程没有自己的虚拟地址空间,与进程内的其他线程一起共享分配给该进程的所有资源。

“同时”执行是人的感觉,在线程之间实际上轮换执行。(这句话简明阐述了多线程的实现机制)

③ 进程在执行过程中拥有独立的内存单元,进程有独立的地址空间,而多个线程共享内存,从而极大地提高了程序的运行效率。

④ 线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。

⑤ 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。

⑥线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。

线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程包含以下内容:

(1)一个指向当前被执行指令的指令指针;
(2)一个栈;
(3)一个寄存器值的集合,定义了一部分描述正在执行线程的处理器状态的值;
(4)一个私有的数据区。

总而言之:

  1. 一个程序至少有一个进程,一个进程至少有一个线程。

  2. 线程的划分尺度小于进程,使得多进程程序的并发性高。

  3. 另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。

  4. 线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。

  5. 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。

在Java中,每次程序运行至少启动2个线程: 一个是main线程,一个是垃圾收集线程。因为每当使用java命令执行一个类的时候,实际上都会启动一个JVM,每一个JVM实际上就是在操作系统中启动了一个进程。

三、一个线程的生命周期

线程是一个动态执行的过程,它也有一个从产生到死亡的过程。下图显示了一个线程完整的生命周期。在这里插入图片描述
1)新建状态:
使用 new 关键字和 Thread 类或其子类建立一个线程对象后,该线程对象就处于新建状态。它保持这个状态直到程序 start() 这个线程。

2)就绪状态:
当线程对象调用了start()方法之后,该线程就进入就绪状态。就绪状态的线程处于就绪队列中,要等待JVM里线程调度器的调度。

3)运行状态:
如果就绪状态的线程获取 CPU 资源,就可以执行 run(),此时线程便处于运行状态。处于运行状态的线程最为复杂,它可以变为阻塞状态、就绪状态和死亡状态。

4)阻塞状态:
如果一个线程执行了sleep(睡眠)、suspend(挂起)等方法,失去所占用资源之后,该线程就从运行状态进入阻塞状态。在睡眠时间已到或获得设备资源后可以重新进入就绪状态。可以分为三种:

①等待阻塞: 运行状态中的线程执行 wait() 方法,使线程进入到等待阻塞状态。

②同步阻塞: 线程在获取 synchronized 同步锁失败(因为同步锁被其他线程占用)。

③其他阻塞: 通过调用线程的 sleep() 或 join() 发出了 I/O 请求时,线程就会进入到阻塞状态。当sleep() 状态超时,join() 等待线程终止或超时,或者 I/O 处理完毕,线程重新转入就绪状态。

5)死亡状态:
一个运行状态的线程完成任务或者其他终止条件发生时,该线程就切换到终止状态。

四、多线程的目的和意义

多线程的意义: 其实任何一个程序的执行都需要获得cpu的执行权,是由cpu来去决定到底是由哪个程序来去执行,那么多线程的存在其实就是“最大限度的利用cpu资源”,当某一个线程的处理不需要占用cpu而之和I/O打交道的时候,让需要占用cpu资源的其他线程有机会获得cpu资源。从根本上说,这就是说多线程编程的目的。

多线程的目的: 不同于其他大多数编程语言,Java本身内置了多线程的支持。使用多线程,可以帮助我们编写出cpu最大利用率的高效程序,使得空闲时间降到最低,这个对于Java运行的交互式的网络互联环境是至关重要的,因为空闲时间是公共的。例如,网络的传输效率远远低于计算机的处理速度,而本地文件系统资源的读写速度也远远低于cpu的处理能力。多线程使得并且能够充分利用这些空闲时间。

五、线程的实现的方式

①继承Thread类:

在这里插入图片描述
在利用Thread类实现多线程的代码,需要去重写的run()方法,但是重写完run()方法 之后,在main函数中只会利用线程类创建对象,然后调用的是start()方法

在这里大家可能会问了,为什么不是直接调用重写好的run()方法 呢?而是是利用start()方法 来开启线程的操作呢?

这里我简单来回答一下吧, 首先通过对象.run() 方法可以执行方法,但是不是使用的多线程的方式,就是一个普通的方法,要想实现多线程的方式,一定需要通过对象.start() 方法。Java 中实现真正的多线程是 start 中的 start() 方法,run() 方法只是一个普通的方法。

②实现Runnable接口:

在这里插入图片描述
③使用继承Thread类的方法和使用实现Runnable接口的方法之间的关系与区别:

(1)Thread类 本身也是实现了Runnable接口,因此也是实现了Runnable接口 中的run方法

(2)当使用继承Thread类 去实现线程时,我们需要重写run方法,因为Thread类 中的run方法 本身什么事情都不干。

(3)当使用实现Runnable接口 去实现线程时,我们需要重写run方法,然后使用new Thread(Runnable) 这种方式来生成线程对象,这个时候线程对象中的run方法 才会去执行我们自己实现的Runnable接口 中的run方法


http://chatgpt.dhexx.cn/article/iDClvKPg.shtml

相关文章

Qt实现多线程编程的两种方式

Qt实现多线程编程的两种方式 方式一&#xff1a; 继承自QThread类&#xff0c;覆写run函数。此实现方法只有run函数内的代码是运行在子线程内。 代码示例&#xff1a; #ifndef QDEMOTHREAD_H #define QDEMOTHREAD_H#include <QThread> #include <QDebug>class QD…

Java 多线程编程 实验题

Java 多线程编程 实验二 1.创建键盘操作练习2. 双线程猜数字3. 月亮围绕地球 1.创建键盘操作练习 题目描述&#xff1a; 编写一个Java应用程序&#xff0c;在主线程中再创建两个线程&#xff0c; 一个线程负责给出键盘上字母键上的字母&#xff0c;另一个线程负责让用户在命令…

Python多线程编程(详细:适合小白入门)

目录 前言 一、进程 1.多任务 2.进程 3.多进程完成多任务 3.1进程的创建步骤 3.2通过进程类创建进程对象 3.3创建进程和启动的代码 4. 进程执行带有参数的任务 5.获取进程编号 6.进程的注意点 6.1主进程会等待所有的子进程执行结束后再结束 6.2设置守护主进程&…

使用qt实现多线程编程

目录 1、线程基础 1.1、GUI线程与工作线程 1.2、数据的同步访问 2、QT多线程简介 3、QThread线程类 4、创建并启动线程 QThread类提供不依赖于平台的管理线程的方法。一个QThread类的对象管理一个线程&#xff0c;一 般从QThread继承一个自定义类&#xff0c;并重定义虚函…

ZMQ之多线程编程

使用ZMQ进行多线程编程&#xff08;MT编程&#xff09;将会是一种享受。在多线程中使用ZMQ套接字时&#xff0c;你不需要考虑额外的东西&#xff0c;让它们自如地运作就好。 使用ZMQ进行多线程编程时&#xff0c;不需要考虑互斥、锁、或其他并发程序中要考虑的因素&#xff0c;…

C++之多线程编程

一、并发的实现 1.多进程并发主要解决进程间通信的问题 ①同一电脑上&#xff1a;管道、文件、消息队列、内存共享。 ②不同电脑上&#xff1a;socket网络通信。 2. 单进程中的多个线程并发&#xff08;一个主线程多个子线程实现并发&#xff09; ①一个进程中的所有线程共享内…

Springboot异步多线程编程

文章目录 一、基础知识二、什么时候用同步&异步三、什么时候需要使用多线程四、springboot异步多线程编程实现 一、基础知识 同步&#xff1a;同步就是指一个进程在执行某个请求的时候&#xff0c;若该请求需要一段时间才能返回信息&#xff0c;那么这个进程将会一直等待下…

【线程】多线程编程

目录 一、概念 1.进程与线程的区别是&#xff1f;&#xff08;常问&#xff09; 2.线程与fork系统调用 3.线程的优缺点 4.线程的实现方式 二、线程函数 1.pthread_create 2.pthread_exit 3.pthread_join 4.pthread_cancel 三、线程的使用 1.线程的基本操作 2.并发…

多线程编程及线程间通信机制

对进程线程的印象还是比较好的,这对于学习C高级的朋友是非常重要的,怎样更快的学习到线程的具体使用呢?最好的办法自然是练习再练习,然后还要看很多的代码才是,之前又听说了一个IT同行过劳死,特别的提醒广大的IT从业者,要注意合理的作息习惯,健康才是最重要的,下面结合…

多线程编程

多线程指的是一个程序中包含两个或者两个以上的线程&#xff0c;多线程的提出是为提高代码的执行效率&#xff0c;这就好比工厂中的流水线&#xff0c;只有一条称为单线程&#xff0c;有多条流水线就称为多线程。多线程提高效率的同时由于并发执行的不确定性&#xff0c;导致出…

两种 C++ 多线程编程方式,看完不懂打我...

多线程在实际编程中的重要性不言而喻&#xff0c;对 C 而言&#xff0c;当我们需要使用多线程时&#xff0c;有多种方案可供选择。比如 POSIX 线程 pthread、boost::thread 库、C11 开始支持的 std::thread 库&#xff0c;以及其他一些第三方库 libdispatch&#xff08;GCD&…

ARP攻击模拟工具

以下是本人平时的一些小作品&#xff0c;特此和大家一起分享... ARP攻击模拟工具 第一代 说明&#xff1a; 实现模拟以太网的ARP欺骗攻击和IP地址冲突攻击。 此为本人早期作品&#xff0c;固比较简陋和不完善&#xff0c;漏洞及错误之处可能较多请多多包涵&#xff01; 开发环…

ARP断网攻击

在之前的文章当中&#xff0c;我已经向大家介绍了关于ARP的欺骗原理。再进一步&#xff0c;将其中的原理运用到实战中去&#xff0c;又会有什么效果呢&#xff1f;ARP又可以给我们带来哪些具体的作用呢&#xff1f;毕竟实践要来支撑&#xff0c;我们之前学过的ARP欺骗原理。 我…

ARP-欺骗攻击

测试环境&#xff08;kali:192.168.189.7 win7:192.168.189.6 网关:192.168.189.2&#xff09; arpspoof -i eth0 -t 192.168.189.6 192.168.189.2 &#xff08;目标地址网关地址&#xff09; 接收获取的信息 随意登陆一个网站&#xff0c;可发现用户名及密码已被获取。可以…

ARP攻击原理及解决方法,很实用

故障原因】 局域网内有人使用ARP欺骗的木马程序&#xff08;比如&#xff1a;传奇盗号的软件&#xff0c;某些传奇外挂中也被恶意加载了此程序&#xff09;。 【故障原理】 要了解故障原理&#xff0c;我们先来了解一下ARP协议。 在局域网中&#xff0c;通过ARP协议来完成I…

ARP攻击怎么解决最安全

ARP攻击是指攻击者通过伪造网络中的ARP协议数据包&#xff0c;欺骗其他计算机的网络通信&#xff0c;从而实现中间人攻击等目的。 下面是ARP攻击的解决方法&#xff1a; 静态ARP表绑定MAC地址&#xff1a;在网络管理员的控制下&#xff0c;将主机的IP地址与MAC地址进行绑定&am…

ARP攻击及原理

ARP攻击原理:但凡局域网内存在arp攻击&#xff0c;说明网络存在“中间人” 1.PC1需要跟PC2通信&#xff0c;通过ARP请求包询问PC2的MAC地址&#xff0c;由于采用广播的形式&#xff0c;所以交换机会将ARP请求包从接口PC1广播到PC2和PC3。(注&#xff1a;交换机收到广播/组播/未…

ARP攻击、欺骗及防御

一、广播与广播域概述 1、广播与广播域 广播&#xff1a;将广播地址做为目的地址的数据帧。 广播域&#xff1a;网络中能接收到同一个广播所有节点的集合。 2、MAC地址广播 广播地址为FF-FF-FF-FF-FF-FF 3、IP地址广播 1&#xff09;255.255.255.255 2&#xff09;广播…

ARP攻击原理和kali实现ARP攻击

目录 一、ARP协议和ARP攻击1.ARP协议2.利用Wireshark分析ARP数据包3.ARP攻击 二、kali实现ARP攻击和ARP欺骗1.实验过程2.问题记录T_T 一、ARP协议和ARP攻击 1.ARP协议 ARP协议&#xff0c;地址解析协议&#xff08;Address Resolution Protocol&#xff09;&#xff0c;用来实…

怎么处理ARP攻击

ARP故障说明: ping 的时候可能好久才能接收到一个响应&#xff0c;或者说干脆就Ping不通。网络时好时坏&#xff0c;通过ARP -a命令不能看到同网段的在线用户&#xff0c;但是net view 可以看到全网开放共享的电脑名&#xff0c;这时候就需要注意了&#xff0c;可能是ARP攻击。…