一文彻底搞懂如何创建线程

文章目录

  • 1. java创建线程(Thread)方式
  • 2. 继承 Thread 类
  • 3. 实现 Runnable 接口
  • 4. 实现 Callable 接口
  • 5. 使用线程池
  • 6. 使用匿名类

1. java创建线程(Thread)方式

方式一:继承于Thread类,这是最常见的创建线程的方式之一,通过继承 Thread 类并重写其 run() 方法来定义线程要执行的任务。
方式二:实现Runnable接口,这是另一种常见的创建线程的方式,通过实现 Runnable 接口并将其作为参数传递给 Thread 类来创建线程。
方式三:实现Callable接口,Callable 接口与 Runnable 类似,但它可以返回线程执行的结果,并且可以抛出异常。
方式四:使用线程池,线程池可以重用线程并且可以控制并发线程的数量,是一种高效的管理线程的方式。
方式五:使用匿名类,可以使用匿名类直接创建线程,适用于任务较为简单的情况。
在这里插入图片描述

2. 继承 Thread 类

步骤:

  • 创建一个继承自 Thread 类的子类。
  • 重写 Thread 类的 run() 方法,定义线程要执行的任务。
  • 创建子类的实例对象,并调用 start() 方法启动线程。

优点:

  • 实现简单,无需创建额外的类。
  • 可以直接通过继承来定义线程要执行的任务。

缺点:

  • 由于 Java 是单继承的,如果已经继承了其他类,则无法再使用这种方式创建线程。
  • 与实现 Runnable 接口相比,代码的灵活性稍差。
class MyThread extends Thread {public void run() {// 线程执行的任务}
}// 启动线程
MyThread myThread = new MyThread();
myThread.start();

3. 实现 Runnable 接口

步骤:

  • 创建一个实现了 Runnable 接口的类。
  • 实现接口中的 run() 方法,定义线程要执行的任务。
  • 创建该类的实例对象,并将其传递给 Thread 类的构造函数。
  • 调用 Thread 对象的 start() 方法启动线程。

优点:

  • 灵活性高,一个类可以同时实现多个接口。
  • 适用于多线程共享同一个实例的情况。

缺点:

  • 由于 Java 不支持多重继承,如果类已经继承了其他类,则无法使用这种方式。
class MyRunnable implements Runnable {public void run() {// 线程执行的任务}
}// 启动线程
Thread thread = new Thread(new MyRunnable());
thread.start();

4. 实现 Callable 接口

步骤:

  • 创建一个实现了 Callable 接口的类。
  • 实现接口中的 call() 方法,定义线程要执行的任务,并可以返回执行结果。
  • 创建 FutureTask 对象,将 Callable 对象传递给它。
  • 创建 Thread 对象,将 FutureTask 对象传递给它。
  • 调用 Thread 对象的 start() 方法启动线程。

优点:

  • 可以返回任务执行的结果。
  • 支持线程间的异常处理。

缺点:

  • 相对于 Runnable 接口,实现稍微复杂一些。
  • 不支持在构造函数中传递参数。
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;class MyCallable implements Callable<String> {public String call() {// 线程执行的任务,并返回结果return "Task Completed";}
}// 启动线程
FutureTask<String> futureTask = new FutureTask<>(new MyCallable());
Thread thread = new Thread(futureTask);
thread.start();

5. 使用线程池

步骤:

  • 创建一个 ExecutorService 对象,通常使用 Executors 工厂类创建。
  • 创建一个实现 Runnable 接口的任务对象。
  • 调用 ExecutorService 对象的 execute() 方法提交任务。
  • 在任务执行完毕后,调用 ExecutorService 对象的 shutdown() 方法关闭线程池。

优点:

  • 重用线程,减少线程创建和销毁的开销。
  • 控制并发线程数,防止资源被耗尽。

缺点:

  • 如果任务队列过长,可能会导致任务排队等待,影响性能。
  • 如果线程池大小设置不合理,可能会出现线程过多或过少的问题。
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;ExecutorService executor = Executors.newFixedThreadPool(5);Runnable task = () -> {// 线程执行的任务
};executor.execute(task);
executor.shutdown();

6. 使用匿名类

步骤:

  • 使用匿名类实现 Runnable 或 Callable 接口。
  • 实现接口中的 run() 或 call() 方法,定义线程要执行的任务。
  • 创建 Thread 对象,将匿名类对象传递给它。
  • 调用 Thread 对象的 start() 方法启动线程。

优点:

  • 不需要额外定义类,代码简洁。
  • 适用于任务较为简单的情况。

缺点:

  • 无法重复使用,不利于代码的复用。
  • 匿名类的作用域有限,只能在创建线程的地方使用。
// 使用匿名类实现 Runnable 接口
Runnable runnable = new Runnable() {public void run() {// 线程执行的任务}
};// 启动线程
Thread thread = new Thread(runnable);
thread.start();

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

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

相关文章

BeanDefinition

这里写目录标题 BeanDefinitionBeanDefinitionReaderAbstractBeanDefinitionReaderXmlBeanDefinitionReader BeanDefinition 上述Spring的基本运行中&#xff0c;你所有的定义描述信息都在XML文件里面&#xff0c;如何读取呢&#xff1f; 当然通过 new ClassPathXmlApplicatio…

常见微服务的组件?

注册中心&#xff1a;就是一个服务注册的地方&#xff0c;我们可以把拆分的服务注册到注册中心&#xff0c;这样注册中心就能管理这些服务&#xff0c;服务之间的调用就会很方便&#xff0c;通过服务名就能相互调用。 负载均衡&#xff1a;被调用放的负载均衡&#xff0c;比如…

【智能算法】黄金正弦算法(GSA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2017年&#xff0c;Tanyildizi等人受到正弦函数单位圆内扫描启发&#xff0c;提出了黄金正弦算法&#xff08;Golden Sine Algorithm, GSA&#xff09;。 2.算法原理 2.1算法思想 GSA来源于正弦函…

FreeBSD下路由问题留档

碰到了一个非常神奇的事情&#xff0c;一台笔记本有以太网和wifi&#xff0c;都可以连到同一台路由器&#xff0c;ip地址配置在同一网段&#xff0c;但是如果插上网线&#xff0c;再拔掉网线的话&#xff0c;那么wifi即使连上&#xff0c;也无法上网。 看路由信息&#xff0c;发…

【Spring源码分析】透过源码看透Spring事务

阅读此需阅读下面这些博客先【Spring源码分析】Bean的元数据和一些Spring的工具【Spring源码分析】BeanFactory系列接口解读【Spring源码分析】执行流程之非懒加载单例Bean的实例化逻辑【Spring源码分析】从源码角度去熟悉依赖注入&#xff08;一&#xff09;【Spring源码分析】…

书生浦语笔记一

2023年6月&#xff0c;InternLM的第一代大模型正式发布。仅一个月后&#xff0c;该模型以及其全套工具链被开源。随后&#xff0c;在8月份&#xff0c;多模态语料库chat7B和lagent也被开源。而在接下来的9月份&#xff0c;InternLM20B的开源发布进一步加强了全线工具链的更新。…

所有企业都在用的微服务框架,需要多强的服务集成能力?

在数字化时代&#xff0c;随着业务规模的扩大和系统复杂性的增加&#xff0c;传统的单体应用架构由于其固有的局限性&#xff0c;已无法高效支撑企业日益增长的业务需求。 为了突破这一瓶颈&#xff0c;微服务架构以其独特的优势崭露头角&#xff0c;逐渐成为企业数字化转型的…

腾讯云容器与Serverless的融合:探索《2023技术实践精选集》中的创新实践

腾讯云容器与Serverless的融合&#xff1a;探索《2023技术实践精选集》中的创新实践 文章目录 腾讯云容器与Serverless的融合&#xff1a;探索《2023技术实践精选集》中的创新实践引言《2023腾讯云容器和函数计算技术实践精选集》整体评价特色亮点分析Serverless与Kubernetes的…

【刷题】 二分查找入门

送给大家一句话: 总有一天&#xff0c;你会站在最亮的地方&#xff0c;活成自己曾经渴望的模样—— 苑子文 & 苑子豪《我们都一样 年轻又彷徨》 二分查找入门 1 前言2 Leetcode 704. 二分查找2.1 题目描述2.2 算法思路 3 Leetcode 34. 在排序数组中查找元素的第一个和最后…

学习笔记——C语言基本概念指针(下)——(8)

1.指针和数组 数组指针 -- 指向数组的指针。 指针数组 -- 数组的元素都是指针。 换句话理解就是&#xff1a;数组指针就是个指针&#xff0c;指针数组就是个数组。 1.1数组指针 数组指针&#xff1a;指向数组的指针&#xff1b; 先回顾一下数组的特点&#xff1a; 1.相…

【C语言】联合体、枚举: 联合体与结构体区别,枚举的优点

目录 1、联合体 1.1、什么是联合体 1.2、联合体的声明 1.3、联合体的特点 1.4、联合体与结构体区别 1.5、联合体的大小 2、枚举 2.1、枚举类型的声明 2.2、枚举类型的优点 3、三种自定义类型&#xff1a;结构体、联合体、枚举 正文 1、联合体 1.1、什么是联合体 联…

如何使用route-detect在Web应用程序路由中扫描身份认证和授权漏洞

关于route-detect route-detect是一款功能强大的Web应用程序路由安全扫描工具&#xff0c;该工具可以帮助广大研究人员在Web应用程序路由中轻松识别和检测身份认证漏洞和授权漏洞。 Web应用程序HTTP路由中的身份认证&#xff08;authn&#xff09;和授权&#xff08;authz&…

题目:小明的背包5(蓝桥OJ 1178)

问题描述&#xff1a; 解题思路&#xff1a; 分组背包模板题&#xff0c;与优化01背包的不同之处在于第一维不可省略&#xff0c;要写s循环。注意要初始化 #include <bits/stdc.h> using namespace std; const int N 1e3 9; int dp[N][N]; // 分组背包模板&#xff0c;…

代码随想录阅读笔记-二叉树【平衡二叉树】

题目 给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡二叉树定义为&#xff1a;一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。 示例 1: 给定二叉树 [3,9,20,null,null,15,7] 返回 true 。 示例 2: 给定二叉树 [1,2,…

ZKFair 创新之旅,新阶段如何塑造财富前景

在当前区块链技术的发展中&#xff0c;Layer 2&#xff08;L2&#xff09;解决方案已成为提高区块链扩容性、降低交易成本和提升交易速度的关键技术&#xff0c;但它仍面临一些关键问题和挑战&#xff0c;例如用户体验的改进、跨链互操作性、安全性以及去中心化程度。在这些背景…

Unity中UI系统1——GUI

介绍 工作原理和主要作用 基本控件 a.文本和按钮控件 练习&#xff1a; b.多选框和单选框 练习&#xff1a; 用的是第三种方法 c.输入框和拖动框 练习&#xff1a; 练习二&#xff1a; e.图片绘制和框 练习&#xff1a; 复合控件 a.工具栏和选择网格 练习&#xff1a; b.滚动视…

纷享销客如何向生态型CRM进化 创始人罗旭给出了答案

自己挣1块钱时&#xff0c;渠道合作伙伴能够挣1块甚至更多。这是纷享销客与生态共建之道。 2024年纷享销客北方战区渠道生态伙伴发展共建会于日前在北京举行。在这场主题为“聚力纷享共赢巅峰”的大会上&#xff0c;各方探讨了企业高质量增长之源与SaaS行业渠道发展之路&#…

云渲染实用工具:3ds max怎么改低版本?

3ds Max是建模领域广泛采用的专业软件&#xff0c;它通过定期更新来不断增强功能和提升性能。但这些频繁的更新有时会导致一些插件暂时无法与新版本完全兼容。为了解决这个问题&#xff0c;设计师们可以采用一个简单有效的方法&#xff0c;那就是将较新版本的3ds Max文件进行版…

基于Unity+Vue3通信交互的WebGL项目发布实践

基于UnityVue3通信交互的WebGL项目发布实践 实践路线 基于UnityVue3通信交互的WebGL项目发布实践问题背景准备工作解决方案项目实践小目标搭建Unity测试项目 创建Vue3测试项目运行项目验证unity和vue通信功能总结与展望 问题背景 我们最近需要把unity开发的pc项目迁移到web端&…

吴恩达深度学习笔记:浅层神经网络(Shallow neural networks)3.9-3.11

目录 第一门课&#xff1a;神经网络和深度学习 (Neural Networks and Deep Learning)第三周&#xff1a;浅层神经网络(Shallow neural networks)3.9 神 经 网 络 的 梯 度 下 降 &#xff08; Gradient descent for neural networks&#xff09;3.10&#xff08;选修&#xff0…