创建线程的三种方法
文章目录
- 1、创建一个类实现Runnable接口,并重写run方法。
- 2、创建一个类继承Thread类,并重写run方法。
- 3、实现Callable接口,重写call()方法,这种方式可以通过FutureTask获取任务执行的返回值。
- 4、run()方法和start()方法有什么区别?
- 5、通过继承 Thread 的方法和实现 Runnable 接口的方式创建多线程,哪个好?
- 6、两种常见的线程控制方法
1、创建一个类实现Runnable接口,并重写run方法。
public class MyThread implements Runnable{ArrayList<String>aaa;public MyThread(ArrayList<String>aaa){this.aaa=aaa;}@Overridepublic void run() {for (int i=0;i<100;i++){aaa.add("aaa"+i);System.out.println(Thread.currentThread().getName()+"aaa"+i+aaa.get(i));}}
}
写一个测试方法
public class ListDemo {public static void main(String[] args) {ArrayList<String>list=new ArrayList<>();MyThread m1=new MyThread(list);MyThread m2=new MyThread(list);new Thread(m1).start();new Thread(m2).start();}
}-----结果------
Thread-0aaa0aaa0
Thread-1aaa0aaa0
Thread-0aaa1aaa0
Thread-1aaa1aaa0
Thread-0aaa2aaa1
Thread-1aaa2aaa1
Thread-0aaa3aaa1
Thread-1aaa3aaa1
Thread-0aaa4aaa2
Thread-1aaa4aaa2
Thread-0aaa5aaa2
Thread-1aaa5aaa2
Thread-1aaa6aaa3
Thread-1aaa7aaa3
Thread-0aaa6aaa3
Thread-1aaa8aaa4
Thread-1aaa9aaa4
Thread-0aaa7aaa3
Thread-1aaa10aaa5
Thread-0aaa8aaa4
Thread-1aaa11aaa5
Thread-0aaa9aaa4
Thread-1aaa12aaa6
Thread-1aaa13aaa6
Thread-0aaa10aaa5
Thread-1aaa14aaa7
Thread-0aaa11aaa5
Thread-1aaa15aaa8
Thread-0aaa12aaa6
Thread-1aaa16aaa7
Thread-0aaa13aaa6
Thread-1aaa17aaa9
Thread-0aaa14aaa7
Thread-1aaa18aaa10
Thread-0aaa15aaa8
Thread-1aaa19aaa8
Thread-0aaa16aaa7
Thread-0aaa17aaa9
Thread-0aaa18aaa10
Thread-0aaa19aaa8Process finished with exit code 0
2、创建一个类继承Thread类,并重写run方法。
public class MyThread extends Thread{ArrayList<String>aaa;public MyThread(ArrayList<String>aaa){this.aaa=aaa;}@Overridepublic void run() {for (int i=0;i<20;i++){aaa.add("aaa"+i);System.out.println(Thread.currentThread().getName()+"aaa"+i+aaa.get(i));}}
}------结果------
Thread-0aaa0null
Thread-1aaa0null
Thread-0aaa1aaa0
Thread-1aaa1aaa0
Thread-0aaa2aaa1
Thread-1aaa2aaa1
Thread-0aaa3aaa1
Thread-1aaa3aaa1
Thread-0aaa4aaa2
Thread-1aaa4aaa2
Thread-0aaa5aaa2
Thread-1aaa5aaa2
Thread-0aaa6aaa3
Thread-1aaa6aaa3
Thread-0aaa7aaa3
Thread-1aaa7aaa3
Thread-0aaa8aaa4
Thread-1aaa8aaa4
Thread-0aaa9aaa4
Thread-0aaa10aaa5
Thread-1aaa9aaa4
Thread-0aaa11aaa5
Thread-1aaa10aaa5
Thread-0aaa12aaa6
Thread-0aaa13aaa6
Thread-0aaa14aaa7
Thread-1aaa11aaa5
Thread-0aaa15aaa7
Thread-1aaa12aaa6
Thread-0aaa16aaa8
Thread-1aaa13aaa6
Thread-0aaa17aaa8
Thread-1aaa14aaa7
Thread-0aaa18aaa9
Thread-1aaa15aaa7
Thread-0aaa19aaa10
Thread-1aaa16aaa8
Thread-1aaa17aaa8
Thread-1aaa18aaa9
Thread-1aaa19aaa10Process finished with exit code 0
3、实现Callable接口,重写call()方法,这种方式可以通过FutureTask获取任务执行的返回值。
public class CallerTask implements Callable<String> {public String call() throws Exception {return "Hello,i am running!";}public static void main(String[] args) {//创建异步任务FutureTask<String> task=new FutureTask<String>(new CallerTask());//启动线程new Thread(task).start();try {//等待执行完成,并获取返回结果String result=task.get();System.out.println(result);} catch (InterruptedException e) {e.printStackTrace();} catch (ExecutionException e) {e.printStackTrace();}}
}
-----结果-----
Hello,i am running!
4、run()方法和start()方法有什么区别?
run():封装线程执行的代码,直接调用相当于调用普通方法。
start():启动线程,然后由JVM 调用此线程的 run() 方法。
5、通过继承 Thread 的方法和实现 Runnable 接口的方式创建多线程,哪个好?
实现Runable接口好,原因有两个:
①、避免了Java单继承的局限性
②、适合多个相同的程序代码去处理同一资源的情况,把线程、代码和数据有效的分离,更符合面向对象的设计思想。
6、两种常见的线程控制方法
- sleep():使当前正在执行的线程暂停指定的毫秒数,也就是进入休眠的状态。
需要注意的是,sleep 的时候要对异常进行处理。
try {//sleep会发生异常要显示处理Thread.sleep(20);//暂停20毫秒
} catch (InterruptedException e) {e.printStackTrace();
}
- join():等待这个线程执行完才会轮到后续线程得到cpu的执行权,使用这个也要抛出异常。
ArrayList<String>list=new ArrayList<>();MyThread m1=new MyThread(list);MyThread m2=new MyThread(list);m1.start();try {m1.join();} catch (InterruptedException e) {e.printStackTrace();}m2.start();
结果:等待m1执行完才会轮到m2
Thread-0aaa0aaa0
Thread-0aaa1aaa1
Thread-0aaa2aaa2
Thread-0aaa3aaa3
Thread-0aaa4aaa4
Thread-0aaa5aaa5
Thread-0aaa6aaa6
Thread-0aaa7aaa7
Thread-0aaa8aaa8
Thread-0aaa9aaa9
Thread-0aaa10aaa10
Thread-0aaa11aaa11
Thread-0aaa12aaa12
Thread-0aaa13aaa13
Thread-0aaa14aaa14
Thread-0aaa15aaa15
Thread-0aaa16aaa16
Thread-0aaa17aaa17
Thread-0aaa18aaa18
Thread-0aaa19aaa19
Thread-1aaa0aaa0
Thread-1aaa1aaa1
Thread-1aaa2aaa2
Thread-1aaa3aaa3
Thread-1aaa4aaa4
Thread-1aaa5aaa5
Thread-1aaa6aaa6
Thread-1aaa7aaa7
Thread-1aaa8aaa8
Thread-1aaa9aaa9
Thread-1aaa10aaa10
Thread-1aaa11aaa11
Thread-1aaa12aaa12
Thread-1aaa13aaa13
Thread-1aaa14aaa14
Thread-1aaa15aaa15
Thread-1aaa16aaa16
Thread-1aaa17aaa17
Thread-1aaa18aaa18
Thread-1aaa19aaa19
附一张线程的生命周期

相关文章:
创建线程的三种方法
文章目录1、创建一个类实现Runnable接口,并重写run方法。2、创建一个类继承Thread类,并重写run方法。3、实现Callable接口,重写call()方法,这种方式可以通过FutureTask获取任务执行的返回值。4、run()方法和start()方法有什么区别…...
第一章---Pytorch快速入门---第三节---pytorch中的数据操作和预处理
目录 1.高维数组 1.1 回归数据准备 1.2 分类数据准备 2. 图像数据 1.torchvision.datasets模块导入数据并预处理 2.从文件夹中导入数据并进行预处理 pytorch中torch.utils.data模块包含着一些常用的数据预处理的操作,主要用于数据的读取、切分、准备等。 常用…...
【代码随想录训练营】【Day38】第九章|动态规划|理论基础|509. 斐波那契数|70. 爬楼梯|746. 使用最小花费爬楼梯
理论基础 动态规划与贪心的区别并不是学习动态规划所必须了解的,所以并不重要。 想要了解动态规划算法题的特点,可以直接做下面三道入门简单题练练手感,找找感觉,很快就能体会到动态规划的解题思想。 总结成一句话就是…...
华为OD机试题 - 快递货车(JavaScript)| 机考必刷
更多题库,搜索引擎搜 梦想橡皮擦华为OD 👑👑👑 更多华为OD题库,搜 梦想橡皮擦 华为OD 👑👑👑 更多华为机考题库,搜 梦想橡皮擦华为OD 👑👑👑 华为OD机试题 最近更新的博客使用说明本篇题解:快递货车题目输入输出示例一输入输出Code解题思路版权说明华为O…...
前端——7.图像标签和路径
这篇文章,我们来讲解一下图像标签 目录 1.图像标签 1.1介绍 1.2实际展示 1.3图像标签的属性 1.3.1 alt属性 1.3.2 title属性 1.3.3 width / height 属性 1.3.4 border属性 1.4注意事项 2.文件夹 2.1目录文件夹和根目录 2.2 VSCode打开目录文件夹 3.路…...
java -- stream流
写在前面: stream流一直在使用,但是感觉还不够精通,现在深入研究一下。 stream这个章节中,会用到 函数式接口–lambda表达式–方法引用的相关知识 介绍 是jdk8引进的新特性。 stream流是类似一条流水线一样的操作,每次对数据进…...
【Spring6】| Bean的四种获取方式(实例化)
目录 一:Bean的实例化方式 1. 通过构造方法实例化 2. 通过简单工厂模式实例化 3. 通过factory-bean实例化 4. 通过FactoryBean接口实例化 5. BeanFactory和FactoryBean的区别(面试题) 6. 使用FactoryBean注入自定义Date 一:…...
01: 新手学SpringCloud前需知道的5点
目录 第一点: 什么是微服务架构 第二点:为什么需要学习Spring Cloud 第三点: Spring Cloud 是什么 第四点: SpringCloud的优缺点 1、SpringCloud优点 2、SpringCloud缺点 第五点: SpringCloud由什么组成 1&…...
ubuntu apt安装arm交叉编译工具
查找查找编译目标为32位的gcc-arm交叉编译器命令apt-cache search arm|awk index($1,"arm")!0 {print}|grep gcc-arm\|g-arm #或者 apt-cache search arm|awk index($1,"arm")!0 {print}|grep -E gcc-arm|g\\-arm输出如下g-arm-linux-gnueabihf - GNU C co…...
阿里云一面经历
文章目录 ES 查询方式都有哪些?1 基于词项的查询term & terms 查询Fuzzy QueryWildcard Query2 基于全文的查询Match QueryQuery String QueryMatch Phrase Query3 复合查询Bool QueryElasticsearch 删除原理ES 大文章怎么存arthas 常用命令arthas 排查问题过程arthas 工作…...
Java Stream中 用List集合统计 求和 最大值 最小值 平均值
对集合数据的统计,是开发中常用的功能,掌握好Java Stream提供的方法,避免自己写代码统计,可以提高工作效率。 先造点数据: pigs.add(new Pig(1, "猪爸爸", 31, "M", false)); pigs.add(new Pig(…...
【Linux】多线程---线程控制
进程在前面已经讲过了,所以这次我们来讨论一下多线程。前言:线程的背景进程是Linux中资源及事物管理的基本单位,是系统进行资源分配和调度的一个独立单位。但是实现进程间通信需要借助操作系统中专门的通信机制,但是只这些机制将占…...
秒杀高并发解决方案
秒杀高并发解决方案 1.秒杀/高并发方案-介绍 秒杀/高并发 其实主要解决两个问题,一个是并发读,一个是并发写并发读的核心优化理念是尽量减少用户到 DB 来"读"数据,或者让他们读更少的数据, 并 发写的处理原则也一样针对秒杀系统需…...
【每日一题】蓝桥杯加练 | Day07
文章目录一、三角回文数1、问题描述2、解题思路3、AC代码一、三角回文数 原题链接:三角回文数 1、问题描述 对于正整数 n, 如果存在正整数 k 使得n123⋯k k(k1)2\frac{k(k1)}{2}2k(k1) , 则 n 称为三角数。例如, 66066 是一个三角数, 因为 66066123⋯363 。 如果一…...
条件语句(分支语句)——“Python”
各位CSDN的uu们你们好呀,最近总是感觉特别特别忙,但是却又不知道到底干了些什么,好像啥也没有做,还忙得莫名其妙,言归正传,今天,小雅兰的内容还是Python呀,介绍一些顺序结构的知识点…...
论文投稿指南——中文核心期刊推荐(国家财政)
【前言】 🚀 想发论文怎么办?手把手教你论文如何投稿!那么,首先要搞懂投稿目标——论文期刊 🎄 在期刊论文的分布中,存在一种普遍现象:即对于某一特定的学科或专业来说,少数期刊所含…...
面向数据安全共享的联邦学习研究综述
开放隐私计算 摘 要:跨部门、跨地域、跨系统间的数据共享是充分发挥分布式数据价值的有效途径,但是现阶段日益严峻的数据安全威胁和严格的法律法规对数据共享造成了诸多挑战。联邦学习可以联合多个用户在不传输本地数据的情况下协同训练机器学习模型&am…...
Redis经典五种数据类型底层实现原理解析
目录总纲redis的k,v键值对新的三大类型五种经典数据类型redisObject结构图示结构讲解数据类型与数据结构关系图示string数据类型三大编码格式SDS详解代码结构为什么要重新设计源码解析三大编码格式hash数据类型ziplist和hashtable编码格式ziplist详解结构剖析ziplist的优势(为什…...
Jackson 返回前端的 Response结果字段大小问题
目录 1、问题产生的背景 2、出现的现象 3、解决方案 4、成果展现 5、总结 6、参考文章 1、问题产生的背景 因为本人最近工作相关的对接外部项目,在我们国内有很多程序员都是使用汉语拼音或者部分字母加上英文复合体定义返回实体VO,这样为了能够符合…...
每天五分钟机器学习:你理解贝叶斯公式吗?
本文重点 贝叶斯算法是机器学习算法中非常经典的算法,也是非常古老的一个算法,但是它至今仍然发挥着重大的作用,本节课程及其以后的专栏将会对贝叶斯算法来做一个简单的介绍。 贝叶斯公式 贝叶斯公式是由联合概率推导而来 其中p(Y|X)称为后验概率,P(Y)称为先验概率…...
手把手教你用Node.js + 免费天气API,5分钟给个人网站加个天气小挂件
零成本打造个性化网站天气组件:Node.js与免费API实战指南 最近在整理个人作品集网站时,突然意识到一个精致的天气小部件能为访客带来更贴心的体验。想象一下,当潜在雇主或客户打开你的网站时,不仅能欣赏你的作品,还能顺…...
风控平台怎么支撑多业务线?一次讲清场景隔离、规则复用、策略分层与平台化治理
一套风控平台怎么支撑多业务线?场景隔离、规则复用、策略分层怎么设计 这篇直接按多业务线风控平台来拆,不只讲“多场景复用”,而是把场景隔离、规则复用、策略分层和平台治理讲具体。 目标是你看完后,能把风控平台从“一个团队自…...
ARM AMAIR0寄存器:内存属性优化与安全配置详解
1. ARM AMAIR0寄存器深度解析在ARM架构的内存管理子系统中,AMAIR0(Auxiliary Memory Attribute Indirection Register 0)是一个关键但常被忽视的系统寄存器。作为内存属性配置体系的重要组成部分,它为处理器提供了扩展的内存属性定…...
大语言模型奉承偏见的成因与优化策略
1. 大语言模型中的奉承偏见现象剖析最近在调试对话系统时发现一个有趣现象:当用户提出明显错误的观点时,模型往往会表现出过度迎合倾向。比如测试者故意说"地球是平的",多数开源模型会回应"这是个有趣的观点"而非纠正错误…...
Windows系统优化终极指南:5个简单步骤用Winhance中文版提升电脑性能
Windows系统优化终极指南:5个简单步骤用Winhance中文版提升电脑性能 【免费下载链接】Winhance-zh_CN A Chinese version of Winhance. C# application designed to optimize and customize your Windows experience. 项目地址: https://gitcode.com/gh_mirrors/w…...
Python包管理与虚拟环境最佳实践
Python包管理与虚拟环境最佳实践 Python作为一门高效灵活的编程语言,其强大的生态系统依赖于丰富的第三方库。随着项目规模的扩大和依赖库的增加,如何高效管理Python包并隔离不同项目的运行环境成为开发者必须面对的问题。本文将介绍Python包管理与虚拟…...
E7Helper终极指南:第七史诗自动化助手完整解决方案
E7Helper终极指南:第七史诗自动化助手完整解决方案 【免费下载链接】e7Helper 【Epic Seven Auto Bot】第七史诗多功能覆盖脚本(刷书签🍃,挂讨伐、后记、祭坛✌️,挂JJC等📛,多服务器支持📺&…...
X-13ARIMA-SEATS时间序列季节调整软件的编译和使用
X-13ARIMA-SEATS软件集成了由美国普查局发明的 ARIMA 算法和西班牙银行发明的SEATS算法,是国际通用的季节调整软件。 它在美国普查局网站(国内上不去)https://www.census.gov/data/software/x13as.X-13ARIMA-SEATS.html提供了源代码和多个平台的预编译二进制文件。分为文本输…...
5分钟快速上手:foobar2000开源歌词插件的完整使用指南
5分钟快速上手:foobar2000开源歌词插件的完整使用指南 【免费下载链接】foo_openlyrics An open-source lyric display panel for foobar2000 项目地址: https://gitcode.com/gh_mirrors/fo/foo_openlyrics 还在为foobar2000寻找一款既美观又强大的歌词显示插…...
告别Excel!用Matlab bar函数批量处理并可视化你的实验数据(附完整脚本)
告别Excel!用Matlab bar函数批量处理并可视化你的实验数据(附完整脚本) 在科研和工程实践中,我们常常需要处理大量结构相似的实验数据文件,并生成统一的柱状图用于报告或对比分析。传统的手动处理方式不仅效率低下&…...
