创建线程的三种方法
文章目录
- 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)称为先验概率…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
mac 安装homebrew (nvm 及git)
mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...
并发编程 - go版
1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...
基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...
