Java-Thread 几种创建方式

Thread

创建线程的四种方法:
  1. 继承Thread类创建线程类,然后创建线程实例。
  2. 实现Runnable借口创建线程目标类,然后创建线程实例。
  3. 使用Callable和FutureTask创建异步任务,然后创建线程实例。
  4. 通过线程池创建线程

Runnable异步任务的问题:

  1. 不能获取异步执行目标的结果
  2. 不能取消异步执行的任务

解决方法: 使用“可以进行管理的异步任务” 相关类: Future接口和FutureTask 类型

start和run方法的区别:

  1. 用start()来启动线程,实现了真正意义上的启动线程,此时会出现异步执行的结果,即在Thread实例所对应的内核线程,去执行run方法中的业务代码。 start()启动了thread实例的生命周期。
  2. 直接调用Thread实例的run() ,相当于当前线程直接执行一次其业务逻辑代码,是同步执行,就不是异步执行了,不会达到使用线程的意义。 run()没有启动thread实例的生命周期。就是一个普通方法的同步调用
线程数配置方案

IO密集型任务创建线程池:CPU核心数2-1 CPU密集型任务创建线程池:CPU核心数 混合型任务创建线程池:最佳线程数 = ((线程等待时间 + 线程CPU时间) / 线程CPU时间) CPU核心 最佳线程数 = (线程等待时间与线程CPU时间之比 + 1) * CPU核数 例:比如在web服务器处理HTTP请求时,假设平均线程CPU运行时间为100ms,而线程等待时间(比如包括DB操作/RPC操作/缓存操作等)为900ms,如果CPU核心数为8,那么根据上面这个公司,估算如下:

(900ms + 100ms) / 100ms * 8 = 10*8 = 80

经过计算,以上案例中需要的线程数为80

ThreadLocal

无锁编程的实现方案 “线程本地变量” 可以看出专属于线程的变量,不受其它线程干扰,保存着线程的专属数据。当线程结束后,每个线程所拥有的那一个本地值也会被释放。在多线程并发操作“线程本地变量”时候,线程各自操作的是自己的本地值,从而规避了线程安全的问题。

ThreadLocal本地变量使用场景

  1. 线程隔离
  2. 跨函数传递数据

为什么需要使用private static final 修饰ThreadLocal 变量?

使用final进行加强修饰的原因:以防止其在使用过程中发生动态变更;

static final 修饰ThreadLocal对象

这使得Thread实例内部的ThreadLocalMap中Entry的key 在 Thread 实例的生命周期内将始终保证为非null,从而导致Key所在的Entry不会被自动清空,这就会导致Entry中的value指向的对象一直存在强引用 value 指向的对象在线程生命周期内不会被释放, 最终导致内存泄露。

所以: 使用完后必须使用remove() 进行手动释放。

ThreadLocalMap 中的Entry 的key为弱引用;

概念

阻塞表示线程的一种状态,在这种状态下,线程是不占用CPU的(也就是说,不执行你写的命令代码的),更进一步来说,也就是你的代码在执行过程中,在某个地方暂停了。

首先,一个线程不应该由其他线程来强制中断或停止,而是应该由线程自己自行停止。所以,Thread.stop, Thread.suspend, Thread.resume 都已经被废弃了。

而 Thread.interrupt 的作用其实也不是中断线程,而是「通知线程应该中断了」,具体到底中断还是继续运行,应该由被通知的线程自己处理。

具体来说,当一个线程,调用interrupte()时:

  1. 如果线程处于被阻塞状态(例如处于sleep,wait,join等状态),那么线程将立即退出阻塞状态,并抛出一个异常InterruptedException异常。【Java类库中提供的一些可能会发生阻塞的方法都会抛InterruptedException异常,如:BlockingQueue#put、BlockingQueue#take、Object#wait、Thread#sleep】
  2. 如果线程处于正常活动状态,那么会将线程的中断标识设置为true。被设置中断标志的线程将继续正常运行,不受影响。
中断

在Java中没有办法立即停止一条线程,然而停止线程却显得尤为重要,如取消一个耗时操作。因此,Java提供了一种用于停止线程的机制-------中断。

  • 中断只是一种协作机制,Java没有给中断增加任何语法,中断的过程完全需要程序员自己实现。若要中断一个线程,你需要手动调用该线程的interrupted方法,该方法也仅仅是将线程对象的中断标识设成true;接着你需要自己写代码不断地检测当前线程的标识位;如果为true,表示别的线程要求这条线程中断,此时究竟该做什么需要你自己写代码实现。
  • 每个线程对象中都有一个标识,用于表示线程是否被中断;该标识位为true表示中断,为false表示未中断;
  • 通过调用线程对象的interrupt方法将该线程的标识位设为true;可以在别的线程中调用,也可以在自己的线程中调用。
中断的相关方法
  • public void interrupt() 将调用者线程的中断状态设为true。
  • public boolean isInterrupted() 判断调用者线程的中断状态。
  • public static boolean interrupted 只能通过Thread.interrupted()调用。 清除执行此方法的线程的中断标识
  • public static boolean interrupted() {return currentThread().isInterrupted(true);
    }
    
它会做两步操作:
  1. 返回当前线程的中断状态;
  2. 将当前线程的中断状态设为false;

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

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

相关文章

ADO .Net操作SQL Server数据库

//ADO.NET是.NET Framework提供的数据访问服务的类库,应用程序可以使用ADO.NET连接到这些数据源,并检索、处理和更新数据 //常用的数据源包括四种:(1)Microsoft SQL Server数据源:使用System.Data.SqlClien…

Python3 字符编解码

Python3 字符编解码 什么是字符编解码 编码:根据编码格式将人类认识的字符转为字节流。解码:根据编码格式将字节流转为人类认识的字符。 Python3 中的字符编码 utf-8为Python3的默认编码格式,可通过以下语句查看: import sys p…

MongoDB聚合运算符:$floor

文章目录 语法使用举例 $floor聚合运算符返回小于等于指定数值的最大整数&#xff0c;相当于取整函数。 语法 { $floor: <number> }<number>表达式为数值表达式。 使用 如果参数<number>的值为null或引用的字段不存在&#xff0c;$floor返回null&#xf…

DC-1靶机渗透测试

DC-1靶机渗透测试 一、信息搜集1、嗅探寻找存活主机2、查找开放端口3、查找敏感目录 二、漏洞利用1、web访问2、寻找Drupal 的config文件3、寻找网站登录密码4、寻找靶机的用户名和密码5、远程登录6、提权 一、信息搜集 1、嗅探寻找存活主机 命令&#xff1a;arp-scan -l 找到…

基于单片机的智能小车泊车系统设计

摘 要:随着信息技术的进步,汽车逐渐朝着安全、智能方向发展,智能泊车系统的出现不仅能帮助人们更加快速、安全地完成泊车操作,而且适用于狭小空间的泊车操作,降低驾驶员泊车负担,减轻泊车交通事故发生率。文章基于单片机设计自动泊车系统,以单片机为核心来实现信息收集及…

【Numpy】练习题100道(51-75题)

&#x1f33b;个人主页&#xff1a;相洋同学 &#x1f947;学习在于行动、总结和坚持&#xff0c;共勉&#xff01; #学习笔记# Git-hub链接 目录 1.题目列表 2.题解 1.题目列表 51. 创建一个表示位置&#xff08;x,y&#xff09;和颜色&#xff08;r,g,b&#xff09;的结…

C#控制台贪吃蛇

Console.Write("");// 第一次生成食物位置 // 随机生成一个食物的位置 // 食物生成完成后判断食物生成的位置与现在的蛇的身体或者障碍物有冲突 // 食物的位置与蛇的身体或者障碍物冲突了&#xff0c;那么一直重新生成食物&#xff0c;直到生成不冲突…

19双体系Java学习之数组的Arrays类

数组的Arrays类 ★小贴士 sort方法对数组进行排序&#xff0c;方法调用完成后&#xff0c;数组按升序排列。 binarySearch方法对数组进行二分查找&#xff0c;如果能找到需要查找的元素则返回该元素的下标&#xff0c;否则返回一个负数&#xff0c;详见binarySearch的范例代码。…

如何将Excel两列数据转换为统计图、曲线图、折线图?如何自定义某一列作为Excel的统计图横纵坐标?

这样&#xff0c;横坐标就更换为指定选中的数据了 我们还可以修改统计图的样式 也可以修改统计图的类型

代码随想录算法训练营第41天 | 01背包问题(二维+一维) ,416. 分割等和子集

动态规划章节理论基础&#xff1a; https://programmercarl.com/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html 01背包理论基础 链接&#xff1a;https://programmercarl.com/%E8%83%8C%E5%8C%85%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%8001%…

Linux-centos系统中如何去除配置文件中的注释部分

1.备份配置文件 将原有的配置文件备份到一个新的文件 备份配置文件可以在我们误操作时及时的补救 #将原有的配置文件复制一份到指定的文件夹 &#xff08;这个文件夹用来专门存放配置文件的源文件&#xff0c;文件夹自行创建&#xff09;cp filename.conf /file_path/config…

ClickHouse副本节点数据损坏恢复

参考链接&#xff1a;https://blog.csdn.net/qq_42082701/article/details/127771766 参考链接&#xff1a;https://kb.altinity.com/altinity-kb-setup-and-maintenance/suspiciously-many-broken-parts/ # 背景CK配置为1分片2副本# 配置参数,这里我们将max_suspicious_brok…

大数据时代的电商:如何利用API进行高效的数据采集与分析

在大数据时代&#xff0c;电商平台积累的数据量是前所未有的。有效地采集、分析和利用这些数据对于提升商家的竞争力至关重要。API&#xff08;应用程序编程接口&#xff09;作为连接不同系统和数据的桥梁&#xff0c;在此过程中发挥着核心作用。以下是如何利用API进行高效数据…

redis学习-List类型相关命令以及特殊情况分析

目录 1. lpush key value1 value2 ... 2. lrange key start end 3. lpop key num 4. rpush key value1 value2 ... 5. rpop key num 6. lindex key index 7. llen key 8. lrem key num value 9. rpoplpush key1 key2 10. lset key index value 11. linsert key before/after…

蓝桥杯第八届A组:分巧克力

题目描述 儿童节那天有 K 位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友们。 小明一共有 NN 块巧克力&#xff0c;其中第 ii 块是 HiWiHi​Wi 的方格组成的长方形。为了公平起见&#xff0c; 小明需要从这 NN 块巧克力中切出 K 块巧克力分给小朋友们。切出的巧克…

Python基础算法解析:支持向量机(SVM)

支持向量机&#xff08;Support Vector Machine&#xff0c;SVM&#xff09;是一种用于分类和回归分析的机器学习算法&#xff0c;它通过在特征空间中找到一个最优的超平面来进行分类。本文将详细介绍支持向量机的原理、实现步骤以及如何使用Python进行编程实践。 什么是支持向…

Python入门教程(一)|基本语法概述

目录 1. 注释 2. 变量和数据类型 3. 控制流 4. 函数 5. 类与对象 6. 异常处理 7. 模块和包 8. 文件操作 1. 注释 在Python中&#xff0c;单行注释以#开始&#xff0c;多行注释使用三个引号 """ 或 。 # 这是单行注释""" 这是 多行 注释…

【开发方案】Android 双卡设备手动搜网功能适配

一、背景 存在运营商需求:当SIM卡设置中选择了自动搜网,那么在重启开机后要执行一次手动搜网。 若基于本身单卡的实现,只搜索卡槽0的,而且写成了单线程,那么就在适配双卡的过程中还需要调整设计模式。 二、源码逻辑 Settings应用发送消息,Telephony 模块Handler回调方…

栈与队列|150.逆波兰表达式求值

力扣题目链接 class Solution { public:int evalRPN(vector<string>& tokens) {// 力扣修改了后台测试数据&#xff0c;需要用longlongstack<long long> st; for (int i 0; i < tokens.size(); i) {if (tokens[i] "" || tokens[i] "-&qu…

南卡罗来纳州历史和文化经济地理和自然政治和社会教育1. 加州大学公布2024年秋季入学新生和转学申请数据2. 2024考研国家线公布路德会信徒核心信仰礼拜和

目录 南卡罗来纳州 历史和文化 经济 地理和自然 政治和社会 教育 1. 加州大学公布2024年秋季入学新生和转学申请数据 2. 2024考研国家线公布 路德会信徒 核心信仰 礼拜和实践 分布 社会和文化影响 约翰塞巴斯蒂安巴赫 生平简介 音乐风格和作品 遗产和影响 …