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

文章目录

  • 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,一经查实,立即删除!

相关文章

SAP GBB中Transaction Key 都代表何种业务过账?

【GBB】offsetting entry 用于IM过账的库存冲销分录。依据为移动类型科目分组中的科目修改分配移动类型。 如下科目分组应在标准系统中定义。可以直接使用。 你也可以定义自己的移动类型科目分组。 涉及到的SAP 标准科目修改&#xff08;一般修改&#xff09;如下&#xff1a…

BeanDefinition

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

无符号整型数0减1

无符号数0减1等于多少&#xff1f; 对于无符号整数来说&#xff0c;0是最小值&#xff0c;一般不能再减1了。因为无符号整数不能表示负数&#xff0c;当无符号数再减1时&#xff0c;会发生下溢&#xff0c;即最高位变为1&#xff0c;最低位变为0&#xff0c;结果变成一个非常大…

常见微服务的组件?

注册中心&#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的…

Java学习36-Java 多线程安全:懒汉式和饿汉式

JAVA种有两种保证线程安全的方式&#xff0c;分别叫懒汉式Lazy Initialization和饿汉式Eager Initialization&#xff0c;以下是他们的区别&#xff1a; 线程安全性&#xff1a; 懒汉式本身是非线程安全的&#xff0c;因为多个线程可能同时检查实例是否为null&#xff0c;并尝…

【刷题】 二分查找入门

送给大家一句话: 总有一天&#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;…

c++计算浮点数相除的余

题目描述 计算两个双精度浮点数a和b的相除的余数&#xff0c;a 和 b 都是双精度浮点数。这里余数&#xff08;r&#xff09;的定义是&#xff1a;akbr&#xff0c;其中k是整数,及 ka/b&#xff0c;0<r<b 输入描述 输入仅一行&#xff0c;包括两个双精度浮点数 a 和 b。 输…

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

题目 给定一个二叉树&#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.滚动视…