Java 多线程创建:三种主要方法

多线程编程是Java中一个重要的技术点,它允许程序并行执行多个任务,从而提高程序的执行效率。本文将详细介绍在Java中创建多线程的三种主要方法:继承Thread类、实现Runnable接口以及使用CallableFuture接口。

1. 继承 Thread

继承Thread类是创建线程的最直接方式。通过创建一个继承自Thread类的类,并重写run()方法,可以将线程执行的任务放入其中。

步骤:
  1. 创建一个类继承java.lang.Thread类。
  2. 重写run()方法,将线程执行的任务放入run()方法中。
  3. 创建该类的实例。
  4. 调用实例的start()方法启动线程。
示例代码:
class MyThread extends Thread {@Overridepublic void run() {// 线程执行的任务for (int i = 0; i < 5; i++) {System.out.println("Thread running: " + i);try {Thread.sleep(1000); // 线程休眠1秒} catch (InterruptedException e) {e.printStackTrace();}}}
}public class Main {public static void main(String[] args) {MyThread thread = new MyThread();thread.start(); // 启动线程}
}
优点:
  • 简单直接,代码清晰。
  • 适用于不需要共享资源的场景。
缺点:
  • 由于Java不支持多继承,如果继承了Thread类,就不能继承其他类。
  • 不适用于需要共享资源的场景,因为每个线程都是独立的Thread实例。

2. 实现 Runnable 接口

实现Runnable接口是另一种创建线程的方法,它避免了Java单继承的限制。通过实现Runnable接口的类,并实现其run()方法,可以将线程执行的任务放入其中。

步骤:
  1. 创建一个类实现java.lang.Runnable接口。
  2. 实现run()方法,将线程执行的任务放入run()方法中。
  3. 创建Runnable实现类的实例。
  4. 创建Thread类的实例,并将Runnable实例传递给Thread构造函数。
  5. 调用Thread实例的start()方法启动线程。
示例代码:
class MyRunnable implements Runnable {@Overridepublic void run() {// 线程执行的任务for (int i = 0; i < 5; i++) {System.out.println("Runnable running: " + i);try {Thread.sleep(1000); // 线程休眠1秒} catch (InterruptedException e) {e.printStackTrace();}}}
}public class Main {public static void main(String[] args) {MyRunnable myRunnable = new MyRunnable();Thread thread = new Thread(myRunnable);thread.start(); // 启动线程}
}
优点:
  • 可以实现资源共享,适用于多个线程访问同一个资源的场景。
  • 灵活性更高,因为可以通过实现接口来继承其他类。
缺点:
  • 需要额外创建一个Thread实例,代码相对稍微复杂。

3. 使用 CallableFuture

如果需要在线程执行任务后获取结果,可以使用Callable接口。与Runnable不同,Callablecall()方法可以返回结果,并且可以抛出异常。通过FutureTask类可以包装Callable对象,并将其传递给Thread对象启动线程。

步骤:
  1. 创建一个类实现java.util.concurrent.Callable接口。
  2. 实现call()方法,将线程执行的任务和返回结果放入call()方法中。
  3. 创建Callable实现类的实例。
  4. 创建FutureTask实例,并将Callable实例传递给FutureTask构造函数。
  5. 创建Thread类的实例,并将FutureTask实例传递给Thread构造函数。
  6. 调用Thread实例的start()方法启动线程。
  7. 调用FutureTask实例的get()方法获取线程执行结果。
示例代码:
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;class MyCallable implements Callable<Integer> {@Overridepublic Integer call() {// 线程执行的任务int sum = 0;for (int i = 0; i < 5; i++) {sum += i;System.out.println("Callable running: " + i);try {Thread.sleep(1000); // 线程休眠1秒} catch (InterruptedException e) {e.printStackTrace();}}return sum; // 返回计算结果}
}public class Main {public static void main(String[] args) {MyCallable myCallable = new MyCallable();FutureTask<Integer> futureTask = new FutureTask<>(myCallable);Thread thread = new Thread(futureTask);thread.start(); // 启动线程try {// 获取线程执行结果Integer result = futureTask.get();System.out.println("Result: " + result);} catch (InterruptedException | ExecutionException e) {e.printStackTrace();}}
}
优点:
  • 可以在线程任务完成后获取返回结果。
  • 可以抛出异常并进行处理。
缺点:
  • 相对来说比Runnable接口实现稍微复杂一些。
  • 需要额外的FutureTask来包装Callable实例。

总结

在Java中创建多线程的方法各有优缺点,选择哪种方法取决于具体的使用场景和需求。继承Thread类适用于简单的线程任务实现,而实现Runnable接口则更灵活,适用于需要共享资源的场景。使用CallableFuture接口不仅可以获取线程执行结果,还可以处理任务执行中的异常,更适合复杂的线程任务管理。

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

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

相关文章

【前端每日基础】day34——HTTP和HTTPS

HTTP&#xff08;Hypertext Transfer Protocol&#xff09;和HTTPS&#xff08;Hypertext Transfer Protocol Secure&#xff09;是互联网通信协议&#xff0c;用于在Web浏览器和Web服务器之间传输数据。以下是对HTTP和HTTPS的详细介绍&#xff1a; HTTP&#xff08;Hypertext…

Ubuntu server 24 (Linux) IPtables 双网卡 共享上网NAT 安装配置DHCP

一 开启路由转发功能 sudo vim /etc/sysctl.conf net.ipv4.ip_forward1 sudo sysctl -p 二 安装DHCP #更新软件包列表&#xff1a; sudo apt update #安装DHCP服务器 sudo apt install isc-dhcp-server #修改监听网卡,根据实际修改 sudo vi /etc/default/isc-dhcp-server …

配置 HTTP 代理 (HTTP proxy)

配置 HTTP 代理 [HTTP proxy] 1. Proxies2. curl2.1. Environment2.2. Proxy protocol prefixes 3. Use an HTTP proxy (使用 HTTP 代理)3.1. Using the examples (使用示例)3.1.1. Linux or macOS3.1.2. Windows Command Prompt 3.2. Authenticating to a proxy (向代理进行身…

Tailwindcss Layout布局相关样式及实战案例,5万字长文,附完整源码和效果截图

aspect 相关样式类 基础样式 ClassPropertiesaspect-autoaspect-ratio: auto;aspect-squareaspect-ratio: 1 / 1;aspect-videoaspect-ratio: 16 / 9; 案例&#xff1a;引入B站视频 Use the aspect-* utilities to set the desired aspect ratio of an element. 使用’ asp…

两款 IntelliJ IDEA 的 AI 编程插件

介绍两款 IntelliJ IDEA 的 AI 编程插件&#xff1a;通义灵码和 CodeGeeX。 通义灵码 这是由阿里推出的一个基于通义大模型的 AI 编码助手。 它提供了代码智能生成、研发智能问答等功能。通义灵码经过海量优秀开源代码数据训练&#xff0c;可以根据当前代码文件及跨文件的上下…

kafka-偏移量图解

生产者偏移量&#xff1a;生产者发送消息时写入到哪个位置&#xff08;主题的每个分区会存储一个 leo 即将写入消息的偏移量&#xff09;&#xff0c;每次写完消息 leo 会 1 消费者偏移量&#xff1a;消费者从哪个位置开始消费消息&#xff0c;小于等于 leo&#xff0c;每个组…

数据赋能(107)——体系:数据采集——概述、关注焦点

概述 数据采集是指利用特定设备或技术&#xff0c;从原始数据源中捕获和记录数据的过程。 数据采集的主要目的是为了获取特定目标或现象的相关信息&#xff0c;以支持后续的数据分析、决策制定、业务优化等过程。 数据采集的重要性在于为企业和组织提供了关键的信息基础&…

【Qt】对话框

文章目录 1 :peach:对话框介绍:peach:2 :peach:对话框的分类:peach:2.1 :apple:模态对话框:apple:2.2 :apple:非模态对话框:apple:2.3 :apple:混合属性对话框:apple: 3 :peach:Qt 内置对话框:peach:3.1 :apple:消息对话框 QMessageBox:apple: 1 &#x1f351;对话框介绍&#x…

如何配置Oracle的ACL权限

配置Oracle的ACL&#xff08;访问控制列表&#xff09;权限是一个涉及多个步骤的过程。以下是一个清晰的步骤指南&#xff0c;用于配置Oracle的ACL权限&#xff1a; 1. 创建ACL 使用DBMS_NETWORK_ACL_ADMIN.CREATE_ACL过程来创建一个新的ACL。 sql BEGIN DBMS_NETWORK_ACL_…

pod 控制器介绍

一 pod 控制器相关理论介绍 1&#xff0c;Pod控制器 是什么 Pod控制器&#xff0c;又称之为工作负载&#xff08;workload&#xff09;&#xff0c;是用于实现管理pod的中间层&#xff0c;确保pod资源符合预期的状态&#xff0c;pod的资源出现故障时&#xff0c;会尝试进行…

头歌springboot初体验

头歌(HeadGo)平台上的Spring Boot初体验课程为学习者提供了一个深入了解和实践Spring Boot 框架的机会。以下是对头歌Spring Boot初体验课程的清晰归纳和介绍: 1. 课程概述 目标:通过本课程,学习者将能够掌握Spring Boot的基础知识、核心特性和实践应用。 内容:课程内容…

[数据集][目标检测]水下管道泄漏破损检测数据集VOC+YOLO格式2069张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2069 标注数量(xml文件个数)&#xff1a;2069 标注数量(txt文件个数)&#xff1a;2069 标注…

【2024年5月备考新增】】 考前篇(30)《必备资料(13) - 论文串讲-干系人管理》

过程定义输入工具技术输出实际应用识别干系人识别能影响项目决策、 活动或结果的个人、 群体或组织,以及被 项目决策、活动或结 果所影响的个人、群 体或组织,并分析和 记录他们的相关信息 的过程1、项目章程2、立项管理文件 3、项目管理计划.沟通管理计划.干系人参与计划 4、…

时间序列的谱分解pt.2

16.dvi (berkeley.edu)https://www.stat.berkeley.edu/~bartlett/courses/153-fall2010/lectures/16.pdfpt1 时间序列的谱分解-CSDN博客

理解不同层的表示(layer representations)

在机器学习和深度学习领域&#xff0c;特别是在处理音频和自然语言处理&#xff08;NLP&#xff09;任务时&#xff0c;"层的表示"&#xff08;layer representations&#xff09;通常是指神经网络不同层在处理输入数据时生成的特征或嵌入。这些表示捕获了输入数据的…

PostgreSQL的视图pg_locks

PostgreSQL的视图pg_locks pg_locks 是 PostgreSQL 提供的系统视图&#xff0c;用于显示当前数据库中的锁信息。通过查询这个视图&#xff0c;数据库管理员可以监控锁的使用情况&#xff0c;识别潜在的锁争用和死锁问题&#xff0c;并优化数据库性能。 pg_locks 视图字段说明…

新书推荐:1.2 动态链接库与API

本节必须掌握的知识点&#xff1a; kernel32.dll user32.dll gdi32.dll ■动态链接库 最早的软件开发过程&#xff0c;所有的功能实现都是有程序员独立完成的。在这个过程中&#xff0c;我们很快就会发现&#xff0c;有很多常用的功能模块是可以重复利用的&#xff0c;我们将…

【2024年5月备考新增】】 考前篇(29)《必备资料(12) - 论文串讲-沟通管理》

过程定义输入工具技术输出实际应用规划 沟通 管理根据干系人的信 息需求和要求及 组织的可用资产 情况,制订合适 的项目沟通方式 和计划的过程1、项目章程2、项目管理计划.资源管理计划.干系人参与计划 3、项目文件.需求文件.干系人登记册4、事业环境因组织过程资1、专家判断2…

Nginx服务的主配置文件及配置举例

Nginx服务的主配置文件 安装Nginx认识Nginx服务全局配置I/O 事件配置HTTP 配置日志格式设定 访问状态统计配置查看Nginx已安装模块修改 nginx.conf 配置文件重启服务&#xff0c;访问测试 基于授权的访问控制准备用户密码认证文件修改 nginx.conf 配置文件重启服务&#xff0c;…

java向上转型

介绍 代码 父类 package b;public class father_ {//father classString name"动物";int age10;public void sleep() {System.out.println("睡");}public void run() {System.out.println("跑");}public void eat() {System.out.println("…