什么是多线程?线程池?

文章目录

  • 一、什么是多线程?
  • 二、多线程的实现方法
    • 1. 继承Thread类,重写run方法
    • 2. 实现Runnable接口,并创建Thread对象
    • 3. Callable和Future
  • 三、线程的5种状态
      • **New(新创建)**
      • **Runnalbe(可运行)**
      • **Running**
      • **Blocked(阻塞)**
      • **等待(Waiting)**
      • **锁定(Lock)**
      • **死亡(Dead)**
  • 四、线程池的三大方法、七大参数、四种拒绝策略
      • 线程池的三大方法:
      • 线程池的七大参数:
      • 线程的四大拒绝策略:
  • 五、线程池的五种状态
      • RUNNING
      • SHUTDOWN
      • STOP
      • TIDYING
      • TERMINATED


一、什么是多线程?

在 Java 中,多线程是指在一个进程中同时执行多个线程,每个线程都可以独立地执行特定的任务。线程是轻量级的进程,它们共享同一个进程的资源,包括内存空间、文件句柄等。通过多线程,可以提高程序的并发性和性能,因为多个线程可以同时执行,从而更好地利用 CPU 资源。
简单来说: 就是老板请员工帮你去做事。

二、多线程的实现方法

1. 继承Thread类,重写run方法

class ExtendThread extends Thread {      // 继承自Threadprivate String name;public ExtendThread(String name) {this.name = name;}@Overridepublic void run() {                      // 必须重写run方法,并且将线程任务放到run里执行for (int i = 0; i < 5; i++) {System.out.println(name + i);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}
}public class Example {public static void main(String[] args) {ExtendThread t1 = new ExtendThread("线程A");ExtendThread t2 = new ExtendThread("线程B");t1.start();t2.start();}
}

2. 实现Runnable接口,并创建Thread对象

class MyRunnable implements Runnable {   // 必须要实现Runnable接口private String name;public MyRunnable(String name) {this.name = name;}public void run() {                // 必须要有run方法,并且将需要执行的任务放到run方法里for (int i = 0; i < 5; i++) {System.out.println(name + i);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}
}public class Example {public static void main(String[] args) {MyRunnable run1 = new MyRunnable("线程A");MyRunnable run2 = new MyRunnable("线程B");Thread t1 = new Thread(run1);Thread t2 = new Thread(run2);t1.start();t2.start();}
}

3. Callable和Future

前面创建线程的2种方式,都有一个缺陷就是:在执行完任务之后无法获取执行结果。如果需要获取执行结果,就必须通过共享变量或者使用线程通信的方式来达到效果,这样使用起来就比较麻烦。而自从Java 1.5开始,就提供了Callable和Future,通过它们可以在任务执行完毕之后得到任务执行结果。
Callable和Future,它俩 一个产生结果,一个拿到结果Callable接口类似于Runnable,从名字就可以看出来了,但是Runnable不会返回结果,并且无法抛出返回结果的异常,因而Callable功能更强些,被线程执行后,可以返回值,这个返回值可以被Future拿到,也就是说,Future可以拿到异步执行任务的返回值。

 
public interface Callable<V> {V call() throws Exception;
}

三、线程的5种状态

在这里插入图片描述

New(新创建)

当用new创建一个新线程时,如new Thread®,该线程还没有开始运行,此时的状态为新创建状态。此时,程序还没有开始运行线程中的代码,在线程运行之前还有一些基本工作要做。

Runnalbe(可运行)

一旦调用start方法,线程便进入了可运行状态。一个可运行的线程可能正在运行,也可能没有运行,这取决于系统在该时间片里是否调度了该线程。对于常用的抢占式调度系统,它会给每一个可运行线程一个时间片来执行任务,当时间片用完时,操作系统便剥夺该线程的运行权,并给另一个线程运行机会。当选择下一个线程时,操作系统会考虑线程的优先级。不过也有一些操作系统,如像手机,采用的可能是协作式调度系统,在这样的系统中,一个线程只有在调用yield方法、或者被阻塞、或者被等待时,线程才失去控制权。

Running

就是运行状态

Blocked(阻塞)

对于阻塞状态,又可以根据阻塞原因的不同,将其细分为三种类型,分别是等待(Waiting)、锁定(Lock)和其他。处于阻塞状态的线程共同点都是暂时不活动,直到调度器重新激活它。

等待(Waiting)

正在运行的线程内部调用wait()时,该线程便进入阻塞状态(wait()是Object类的方法),并且在wait所在的代码行处停止执行,直到接到通知(notify)或被中断(等待时间到)为止。

需要注意的是:在调用wait方法之前,线程必须获得该对象的对象级别锁,即只能在同步方法或同步块中调用wait方法。

锁定(Lock)

当一个线程视图获取一个内部的对象锁,而该锁却被其他线程持有时,此时这个线程就进入阻塞状态,当所有其他线程释放该锁,并且线程调度器允许该线程持有它的时候,该线程才会变为Runnalbe状态。

其他
另外,还有如果在线程内部调用了sleep()或者jion()方法时,也会使该线程进入阻塞状态。sleep()是指让这个线程休息一段时间,时间到了之后再进入Runnalbe,jion()一般用在主线程中,表示主线程等待子线程把活干完了,再接着往下执行。

死亡(Dead)

线程进入死亡状态主要有以下两种原因:第一,run方法运行完毕,正常退出;第二,因为一个没有捕获的异常终止了run方法,导致线程意外死亡。

四、线程池的三大方法、七大参数、四种拒绝策略

线程池的三大方法:

ExecutorService service = Executors
.newSingleThreadExecutor();//单个线程
.newFixedThreadPool(5);//创建一个固定的线程池的大小
.newCachedThreadPool();//缓存线程池,可伸缩的

线程池的七大参数:

public ThreadPoolExecutor
(
int corePoolSize,//核心线程数
int maximumPoolSize,//最大的线程数
long keepAliveTime,//存活时间
TimeUnit unit,//存活时间的时间单位
BlockingQueue workQueue//阻塞队列)
ThreadFactory threadFactory,//线程工厂,创建线程的,一般不动
RejectedExecutionHandler handler//拒绝策略

)

线程的四大拒绝策略:

第一种拒绝策略:new ThreadPoolExecutor.AbortPolicy(),如果线程满了,则不处理新的进程,抛出异常;
第二种处理策略:new ThreadPoolExecutor.CallerRunsPolicy(),线程池满了,如果有新的哪里来的去哪里,不会抛出异常
第三种处理策略:new ThreadPoolExecutor.DiscardPolicy(),线程池满了,丢掉线程,不会抛出异常
第四种处理策略:
阿里巴巴开发手册对于线程池使用的规范: oom-> out of memory 内存耗尽
在这里插入图片描述

五、线程池的五种状态

线程池的五种状态:
Running、Shutdown、Stop、Tidying、Terminated
分别为:

RUNNING

RUNNING;
● 线程池处于RUNNING状态时,线程池能够接收新任务,也能够对已经添加的任务进行处理;
● 线程池一被创建,线程池的状态就是RUNNING状态;

SHUTDOWN

SHUTDOWN;
● 线程池已经被关闭了,不再接收新任务;但是,其还是会处理队列中的剩余的任务;
● 调用线程池的shutdown()方法后,线程池的状态就会由RUNNING转为SHUTDOWN;

STOP

STOP;
● 线程池处于STOP状态,此时线程池不再接收新任务,不处理已经添加进来的任务,并且会中断正在处理的任务;
● 调用线程池的shutdownNow()方法后,线程池的状态就会由RUNNING或SHUTDOWN转为STOP;

TIDYING

TIDYING;
● 线程池被下达关闭命令后,如果当前所有的任务都已经终止了(这个终止可以表示执行结束,也可以表示强制中断,也可以表示被丢弃) ,那么线程就会进入TIDYING状态;当线程池变为TIDYING状态时,会执行钩子函数terminated()。terminated()在ThreadPoolExecutor类中是空的,若用户想在线程池变为TIDYING时,进行相应的处理;可以通过重载terminated()函数来实现。
● 如果线程状态已经是SHUTDOWN了,并且线程中以及队列中都没有任务时,线程池就会由SHUTDOWN转为TIDYING;如果线程池状态为STOP,那么当线程池把所有的任务都给清理干净时,线程池就会由STOP转为TIDYING;

TERMINATED

TERMINATED;
● 线程池就结束了;线程池就不能重新启动了;
● 如果线程池处于TIDYING状态,那么当线程池执行完terminated()方法后,线程池状态就会由TIDYING转为TERMINTED;

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

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

相关文章

MES生产制造执行管理系统(源码+配套文档)

在当今竞争激烈的制造业环境中&#xff0c;企业要想保持竞争优势&#xff0c;就必须不断提升生产效率、优化管理流程。MES&#xff08;制造执行系统&#xff09;作为连接上层计划管理与底层工业控制的桥梁&#xff0c;正逐渐成为众多制造企业转型升级的关键工具。一个功能全面的…

AI伦理挑战:如何确保技术发展符合道德规范?

引言 随着人工智能&#xff08;AI&#xff09;技术的快速发展&#xff0c;我们正迎来一个前所未有的数字化时代。AI的应用已经渗透到医疗、教育、金融、交通等众多领域&#xff0c;极大地推动了生产效率的提升&#xff0c;改善了人们的生活质量。从智能医疗诊断到自动驾驶汽车…

Qt 自带颜色属性

Qt 系统自带颜色如下&#xff1a; enum GlobalColor {color0,color1,black,white,darkGray,gray,lightGray,red,green,blue,cyan,magenta,yellow,darkRed,darkGreen,darkBlue,darkCyan,darkMagenta,darkYellow,transparent};对应颜色如下&#xff1a; color0: 这是自定义颜色…

MySQL慢查询分析与处理

什么是慢日志 慢日志是MySQL用来记录数据库中执行较慢的SQL语句的日志&#xff0c;当数据库遇到性能问题时&#xff0c;慢日志可以帮助我们分析数据库中执行较慢的SQL。 如何打开数据库慢日志功能 MySQL默认是关闭慢日志功能的&#xff0c;可以从数据库中或者从配置文件中进行…

深度学习基础--ResNet50V2网络的讲解,ResNet50V2的复现(pytorch)以及用复现的ResNet50做鸟类图像分类

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 前言 如果说最经典的神经网络&#xff0c;ResNet肯定是一个&#xff0c;从ResNet发布后&#xff0c;作者又进行修改&#xff0c;命名为ResNe50v2&#xff0c…

TikTok隐私保护措施:确保用户安全

TikTok隐私保护措施&#xff1a;确保用户安全 在这个信息爆炸的时代&#xff0c;社交媒体平台的隐私保护问题日益成为公众关注的焦点。TikTok&#xff0c;作为全球领先的短视频平台&#xff0c;拥有庞大的用户群体&#xff0c;因此&#xff0c;其隐私保护措施显得尤为重要。本…

FFmpeg-chapter3-读取视频流(原理篇)

ffmpeg网站&#xff1a;About FFmpeg 1 库介绍 &#xff08;1&#xff09;libavutil是一个包含简化编程函数的库&#xff0c;包括随机数生成器、数据结构、数学例程、核心多媒体实用程序等等。 &#xff08;2&#xff09;libavcodec是一个包含音频/视频编解码器的解码器和编…

【Redis】Mac系统一键安装redis

要在 macOS 上一键安装 Redis&#xff0c;可以使用 Homebrew&#xff08;一个流行的包管理工具&#xff09;来简化安装过程。下面是可以执行的安装脚本&#xff1a; 安装脚本&#xff1a; #!/bin/bash# 检查 Homebrew 是否已安装&#xff0c;如果没有安装&#xff0c;则安装 …

P1149 [NOIP 2008 提高组] 火柴棒等式c/c++

P1149 [NOIP 2008 提高组] 火柴棒等式c/c 题目描述 给你 n 根火柴棍&#xff0c;你可以拼出多少个形如 ABC 的等式&#xff1f;等式中的 A、B、C 是用火柴棍拼出的整数&#xff08;若该数非零&#xff0c;则最高位不能是 0&#xff09;。用火柴棍拼数字 0∼9 的拼法如图所示&a…

七星棋牌 6 端 200 子游戏全开源修复版源码(乐豆 + 防沉迷 + 比赛场 + 控制)

七星棋牌源码 是一款运营级的棋牌产品&#xff0c;覆盖 湖南、湖北、山西、江苏、贵州 等 6 大省区&#xff0c;支持 安卓、iOS 双端&#xff0c;并且 全开源。这个版本是 修复优化后的二开版本&#xff0c;新增了 乐豆系统、比赛场模式、防沉迷机制、AI 智能控制 等功能&#…

安全模块设计:token服务、校验注解(开启token校验、开启签名校验、允许处理API日志)、获取当前用户信息的辅助类

文章目录 引言pom.xmlI 校验注解ApiValidationII token服务TokenService获取当前用户信息的辅助类III 域登录接口响应数据登陆用户信息引言 pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/PO…

贪心算法精品题

1.找钱问题 本题的贪心策略在于我们希望就可能的保留作用大的5元 class Solution { public:bool lemonadeChange(vector<int>& bills) {std::map<int ,int> _map;for(auto ch:bills){if(ch 5) _map[ch];else if(ch 10){if(_map[5] 0) return false;else{_m…

辛格迪客户案例 | 鼎康生物电子合约系统(eSign)项目

01 案例企业 鼎康(武汉)生物医药有限公司于2013年06月19日成立 &#xff0c;是一家总部位于湖北武汉的CDMO公司&#xff0c;坚持以客户为中心&#xff0c;以及时、经济和高质量为服务导向。鼎康生物拥有先进的150,000平方英尺的生产厂房&#xff0c;生产设施位于中国武汉的Bio…

多个pdf合并成一个pdf的方法

将多个PDF文件合并优点&#xff1a; 能更容易地对其进行归档和备份.打印时可以选择双面打印&#xff0c;减少纸张的浪费。比如把住宿发票以及滴滴发票、行程单等生成一个pdf&#xff0c;双面打印或者无纸化办公情况下直接发送给财务进行存档。 方法: 利用PDF24 Tools网站 …

算法-数据结构(图)-迪杰斯特拉最短逻辑算法( Dijkstra)

迪杰斯特拉算法&#xff08;Dijkstras Algorithm&#xff09; 是一种用于计算单源最短路径的经典算法&#xff0c;由荷兰计算机科学家 艾兹赫尔迪杰斯特拉&#xff08;Edsger W. Dijkstra&#xff09; 于1956年提出。它的主要目标是找到从图中的某个源节点到所有其他节点的最短…

windows设置暂停更新时长

windows设置暂停更新时长 win11与win10修改注册表操作一致 &#xff0c;系统界面不同 1.打开注册表 2.在以下路径 \HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings 右键新建 DWORD 32位值&#xff0c;名称为FlightSettingsMaxPauseDays 根据需求填写数…

降维攻击!PCA与随机投影优化高维KNN

引言&#xff1a;高维数据的“冰山困境” 假设你正在处理一个电商平台的商品图片分类任务&#xff1a;每张图片被提取为1000维的特征向量&#xff0c;100万条数据的距离计算让KNN模型陷入“维度地狱”——计算耗时长达数小时&#xff0c;且内存占用超过10GB。 破局关键&#…

在ubuntu 24.04.2 通过 Kubeadm 安装 Kubernetes v1.31.6

文章目录 1. 简介2. 准备3. 配置 containerd4. kubeadm 安装集群5. 安装网络 calico 插件 1. 简介 本指南介绍了如何在 Ubuntu 24.04.2 LTS 上安装和配置 Kubernetes 1.31.6 集群&#xff0c;包括容器运行时 containerd 的安装与配置&#xff0c;以及使用 kubeadm 进行集群初始…

信刻光盘安全隔离与信息交换系统让“数据摆渡”安全高效

随着数据传输、存储及信息技术的飞速发展&#xff0c;信息安全保护已成为重中之重。各安全领域对跨网数据交互的需求日益迫切&#xff0c;数据传输的安全可靠性成为不可忽视的关键。为满足业务需求并遵守保密规范&#xff0c;针对于涉及重要秘密信息&#xff0c;需做到安全的物…

6.6.5 SQL访问控制

文章目录 GRANT授予权限REVOKE回收权限 GRANT授予权限 GRANT语句可以给用户授予权限&#xff0c;基本格式是GRANT 权限 TO 用户。在授权时&#xff0c;WITH GRANT OPTION是可选项&#xff0c;有此句话&#xff0c;被授予权限的用户还能把权限赋给其他用户。 REVOKE回收权限 RE…