当前位置: 首页 > news >正文

创建线程的三种方法

文章目录

  • 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、两种常见的线程控制方法

  1. sleep():使当前正在执行的线程暂停指定的毫秒数,也就是进入休眠的状态。
    需要注意的是,sleep 的时候要对异常进行处理。
try {//sleep会发生异常要显示处理Thread.sleep(20);//暂停20毫秒
} catch (InterruptedException e) {e.printStackTrace();
}
  1. 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接口&#xff0c;并重写run方法。2、创建一个类继承Thread类&#xff0c;并重写run方法。3、实现Callable接口&#xff0c;重写call()方法&#xff0c;这种方式可以通过FutureTask获取任务执行的返回值。4、run()方法和start()方法有什么区别…...

第一章---Pytorch快速入门---第三节---pytorch中的数据操作和预处理

目录 1.高维数组 1.1 回归数据准备 1.2 分类数据准备 2. 图像数据 1.torchvision.datasets模块导入数据并预处理 2.从文件夹中导入数据并进行预处理 pytorch中torch.utils.data模块包含着一些常用的数据预处理的操作&#xff0c;主要用于数据的读取、切分、准备等。 常用…...

【代码随想录训练营】【Day38】第九章|动态规划|理论基础|509. 斐波那契数|70. 爬楼梯|746. 使用最小花费爬楼梯

理论基础 动态规划与贪心的区别并不是学习动态规划所必须了解的&#xff0c;所以并不重要。 想要了解动态规划算法题的特点&#xff0c;可以直接做下面三道入门简单题练练手感&#xff0c;找找感觉&#xff0c;很快就能体会到动态规划的解题思想。 总结成一句话就是&#xf…...

华为OD机试题 - 快递货车(JavaScript)| 机考必刷

更多题库,搜索引擎搜 梦想橡皮擦华为OD 👑👑👑 更多华为OD题库,搜 梦想橡皮擦 华为OD 👑👑👑 更多华为机考题库,搜 梦想橡皮擦华为OD 👑👑👑 华为OD机试题 最近更新的博客使用说明本篇题解:快递货车题目输入输出示例一输入输出Code解题思路版权说明华为O…...

前端——7.图像标签和路径

这篇文章&#xff0c;我们来讲解一下图像标签 目录 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流一直在使用&#xff0c;但是感觉还不够精通&#xff0c;现在深入研究一下。 stream这个章节中&#xff0c;会用到 函数式接口–lambda表达式–方法引用的相关知识 介绍 是jdk8引进的新特性。 stream流是类似一条流水线一样的操作&#xff0c;每次对数据进…...

【Spring6】| Bean的四种获取方式(实例化)

目录 一&#xff1a;Bean的实例化方式 1. 通过构造方法实例化 2. 通过简单工厂模式实例化 3. 通过factory-bean实例化 4. 通过FactoryBean接口实例化 5. BeanFactory和FactoryBean的区别&#xff08;面试题&#xff09; 6. 使用FactoryBean注入自定义Date 一&#xff1a…...

01: 新手学SpringCloud前需知道的5点

目录 第一点&#xff1a; 什么是微服务架构 第二点&#xff1a;为什么需要学习Spring Cloud 第三点&#xff1a; Spring Cloud 是什么 第四点&#xff1a; SpringCloud的优缺点 1、SpringCloud优点 2、SpringCloud缺点 第五点&#xff1a; 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集合统计 求和 最大值 最小值 平均值

对集合数据的统计&#xff0c;是开发中常用的功能&#xff0c;掌握好Java Stream提供的方法&#xff0c;避免自己写代码统计&#xff0c;可以提高工作效率。 先造点数据&#xff1a; pigs.add(new Pig(1, "猪爸爸", 31, "M", false)); pigs.add(new Pig(…...

【Linux】多线程---线程控制

进程在前面已经讲过了&#xff0c;所以这次我们来讨论一下多线程。前言&#xff1a;线程的背景进程是Linux中资源及事物管理的基本单位&#xff0c;是系统进行资源分配和调度的一个独立单位。但是实现进程间通信需要借助操作系统中专门的通信机制&#xff0c;但是只这些机制将占…...

秒杀高并发解决方案

秒杀高并发解决方案 1.秒杀/高并发方案-介绍 秒杀/高并发 其实主要解决两个问题&#xff0c;一个是并发读&#xff0c;一个是并发写并发读的核心优化理念是尽量减少用户到 DB 来"读"数据&#xff0c;或者让他们读更少的数据, 并 发写的处理原则也一样针对秒杀系统需…...

【每日一题】蓝桥杯加练 | Day07

文章目录一、三角回文数1、问题描述2、解题思路3、AC代码一、三角回文数 原题链接&#xff1a;三角回文数 1、问题描述 对于正整数 n, 如果存在正整数 k 使得n123⋯k k(k1)2\frac{k(k1)}{2}2k(k1)​ , 则 n 称为三角数。例如, 66066 是一个三角数, 因为 66066123⋯363 。 如果一…...

条件语句(分支语句)——“Python”

各位CSDN的uu们你们好呀&#xff0c;最近总是感觉特别特别忙&#xff0c;但是却又不知道到底干了些什么&#xff0c;好像啥也没有做&#xff0c;还忙得莫名其妙&#xff0c;言归正传&#xff0c;今天&#xff0c;小雅兰的内容还是Python呀&#xff0c;介绍一些顺序结构的知识点…...

论文投稿指南——中文核心期刊推荐(国家财政)

【前言】 &#x1f680; 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊 &#x1f384; 在期刊论文的分布中&#xff0c;存在一种普遍现象&#xff1a;即对于某一特定的学科或专业来说&#xff0c;少数期刊所含…...

面向数据安全共享的联邦学习研究综述

开放隐私计算 摘 要&#xff1a;跨部门、跨地域、跨系统间的数据共享是充分发挥分布式数据价值的有效途径&#xff0c;但是现阶段日益严峻的数据安全威胁和严格的法律法规对数据共享造成了诸多挑战。联邦学习可以联合多个用户在不传输本地数据的情况下协同训练机器学习模型&am…...

Redis经典五种数据类型底层实现原理解析

目录总纲redis的k,v键值对新的三大类型五种经典数据类型redisObject结构图示结构讲解数据类型与数据结构关系图示string数据类型三大编码格式SDS详解代码结构为什么要重新设计源码解析三大编码格式hash数据类型ziplist和hashtable编码格式ziplist详解结构剖析ziplist的优势(为什…...

Jackson 返回前端的 Response结果字段大小问题

目录 1、问题产生的背景 2、出现的现象 3、解决方案 4、成果展现 5、总结 6、参考文章 1、问题产生的背景 因为本人最近工作相关的对接外部项目&#xff0c;在我们国内有很多程序员都是使用汉语拼音或者部分字母加上英文复合体定义返回实体VO&#xff0c;这样为了能够符合…...

每天五分钟机器学习:你理解贝叶斯公式吗?

本文重点 贝叶斯算法是机器学习算法中非常经典的算法,也是非常古老的一个算法,但是它至今仍然发挥着重大的作用,本节课程及其以后的专栏将会对贝叶斯算法来做一个简单的介绍。 贝叶斯公式 贝叶斯公式是由联合概率推导而来 其中p(Y|X)称为后验概率,P(Y)称为先验概率…...

1.8.2 掌握Scala类与对象 - 单例对象与伴生对象

本次实战通过三个案例深入解析了 Scala 中 object 的核心机制&#xff0c;展示了其如何替代 Java 的 static 关键字。首先&#xff0c;通过 MathUtils 定义了存放常量与工具方法的独立单例对象&#xff1b;其次&#xff0c;利用 Person 类与其同名对象演示了“伴生对象”特性&a…...

SpringBoot项目里RabbitMQ消息确认(ACK)的三种手动确认模式实战:basicAck、basicNack、basicReject到底怎么选?

SpringBoot项目中RabbitMQ消息确认模式的深度实战指南 1. 消息确认机制的核心价值与业务场景 在分布式系统中&#xff0c;消息队列承担着解耦生产者和消费者的重要职责。RabbitMQ作为最流行的消息中间件之一&#xff0c;其消息确认机制&#xff08;ACK&#xff09;是确保数据…...

2026 最稳 AI 论文工具合集:好用不踩雷

毕业季的论文关卡&#xff0c;早已不是 “单打独斗” 的时代。从选题迷茫、大纲混乱&#xff0c;到文献难找、格式崩溃&#xff0c;再到查重超标、AI 率预警&#xff0c;每一个卡点都在消耗本科生的时间与精力。随着 AI 技术深度渗透学术场景&#xff0c;一批专注毕业论文写作的…...

终极开源解决方案:用Video-subtitle-extractor高效提取视频硬字幕的完整指南

终极开源解决方案&#xff1a;用Video-subtitle-extractor高效提取视频硬字幕的完整指南 【免费下载链接】video-subtitle-extractor 视频硬字幕提取&#xff0c;生成srt文件。无需申请第三方API&#xff0c;本地实现文本识别。基于深度学习的视频字幕提取框架&#xff0c;包含…...

Adobe-GenP 3.0终极指南:如何免费激活Adobe CC全系列软件

Adobe-GenP 3.0终极指南&#xff1a;如何免费激活Adobe CC全系列软件 【免费下载链接】Adobe-GenP Adobe CC 2019/2020/2021/2022/2023 GenP Universal Patch 3.0 项目地址: https://gitcode.com/gh_mirrors/ad/Adobe-GenP Adobe-GenP 3.0是一款强大的Adobe Creative Cl…...

多模型 API 聚合如何赋能智能体实现更复杂的决策与调度

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 多模型 API 聚合如何赋能智能体实现更复杂的决策与调度 在构建高级智能体系统时&#xff0c;单一的模型提供商往往难以满足所有场景…...

如何轻松解锁Cursor Pro完整功能:一键激活与无限使用的完整指南

如何轻松解锁Cursor Pro完整功能&#xff1a;一键激活与无限使用的完整指南 【免费下载链接】cursor-free-vip [Support 0.45]&#xff08;Multi Language 多语言&#xff09;自动注册 Cursor Ai &#xff0c;自动重置机器ID &#xff0c; 免费升级使用Pro 功能: Youve reached…...

Cursor Pro功能解锁:3步实现免费无限制使用AI编辑器完整指南

Cursor Pro功能解锁&#xff1a;3步实现免费无限制使用AI编辑器完整指南 【免费下载链接】cursor-free-vip [Support 0.45]&#xff08;Multi Language 多语言&#xff09;自动注册 Cursor Ai &#xff0c;自动重置机器ID &#xff0c; 免费升级使用Pro 功能: Youve reached yo…...

5分钟搞定B站视频数据分析:让数据采集变得像点外卖一样简单

5分钟搞定B站视频数据分析&#xff1a;让数据采集变得像点外卖一样简单 【免费下载链接】Bilivideoinfo Bilibili视频数据爬虫 精确爬取完整的b站视频数据&#xff0c;包括标题、up主、up主id、精确播放数、历史累计弹幕数、点赞数、投硬币枚数、收藏人数、转发人数、发布时间、…...

caffeine+redis实现多级缓存解决缓存雪崩

废话不多说直接上代码&#xff1a;1.依赖<dependency><groupId>com.github.ben-manes.caffeine</groupId><artifactId>caffeine</artifactId><version>2.9.3</version></dependency>这里版本java8所以用的2.9.32.配置类&#…...