【Java多线程】告别线程混乱!深度解析Java多线程4大实现方式(附实战案例)

一、继承Thread类

实现步骤:
1.继承Thread类
2.重写run()方法
3.创建线程对象并调用start()方法

示例:

class MyThread extends Thread {@Overridepublic void run() {for (int i = 0; i < 5; i++) {System.out.println(Thread.currentThread().getName() + ": " + i);try {Thread.sleep(500); // 模拟耗时操作} catch (InterruptedException e) {e.printStackTrace();}}}
}public class ThreadExample {public static void main(String[] args) {MyThread t1 = new MyThread();MyThread t2 = new MyThread();t1.start(); // 启动线程1t2.start(); // 启动线程2System.out.println("主线程继续执行...");}
}

注意事项:

  • 直接调用run() 方法是普通方法调用,不会启动新线程
  • 一个线程对象只能start()一次

二、实现Runnable接口

实现步骤:
1.实现Runnable接口
2.实现run方法
3.创建Thread对象 并传入Runnable实例
4.调用start()方法

示例:

class MyRunnable implements Runnable {@Overridepublic void run() {for (int i = 0; i < 5; i++) {System.out.println(Thread.currentThread().getName() + ": " + i);}}
}public class RunnableExample {public static void main(String[] args) {MyRunnable runnable = new MyRunnable();Thread t1 = new Thread(runnable, "线程A");Thread t2 = new Thread(runnable, "线程B");t1.start();t2.start();}
}

优势:

  • 避免单继承限制
  • 适合多个线程共享相同代码
  • 更符合面向对象设计思想

三、实现Callable接口(带返回值)

步骤:

1.实现Callable接口
2.实现call()方法
3.创建FutureTask对象包装Callable
4.创建Thread对象并传入FutureTask
5.调用start()方法
6.通过FutureTask.get()获取返回值

import java.util.concurrent.*;class MyCallable implements Callable<Integer> {@Overridepublic Integer call() throws Exception {int sum = 0;for (int i = 1; i <= 100; i++) {sum += i;Thread.sleep(10);}return sum;}
}public class CallableExample {public static void main(String[] args) throws Exception {MyCallable callable = new MyCallable();FutureTask<Integer> futureTask = new FutureTask<>(callable);Thread t = new Thread(futureTask);t.start();// 主线程继续做其他工作System.out.println("主线程正在计算其他内容...");// 获取子线程计算结果(会阻塞直到计算完成)int result = futureTask.get();System.out.println("计算结果: " + result);}
}

特点:

  • 可以获取线程执行结果
  • call()方法可以抛出异常
  • 支持泛型返回值

四、使用线程池(推荐方式)

实现步骤:
1.创建线程池
2.提交任务(Runnable/Callable)
3.关闭线程池

import java.util.concurrent.*;public class ThreadPoolExample {public static void main(String[] args) {// 创建固定大小的线程池ExecutorService executor = Executors.newFixedThreadPool(3);// 提交10个任务for (int i = 0; i < 10; i++) {final int taskId = i;executor.execute(() -> {System.out.println(Thread.currentThread().getName() + " 正在执行任务 " + taskId);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}});}// 关闭线程池executor.shutdown();try {// 等待所有任务完成if (!executor.awaitTermination(60, TimeUnit.SECONDS)) {executor.shutdownNow();}} catch (InterruptedException e) {executor.shutdownNow();}}
}

线程池优势:
1.降低资源消耗复用已创建的线程。
2.提高响应速度:任务到达时线程已存在
3.提高线程可管理性:统一分配、调优和监控
4.防止资源耗尽:通过限制线程数量

5.多线程编程注意事项

1.线程安全:注意共享资源的同步访问
2.避免死锁:按固定顺序获取多个锁
3.性能考量:线程创建和上下文切换有开销
4.资源释放:确保finally块释放锁和IO资源
5.异常处理:子线程异常需特殊处理(可设置UncaughtExceptionHandler)

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

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

相关文章

全国产V7-690T核心板/算法验证板/FPGA开发板

UD SOM-404全国产化信号处理模块既可以作为核心板使用&#xff0c;也可以单独使用。FPGA对外有80组GTY通过两个FMC连接器全部引出&#xff0c;多个模块可以级联使用&#xff0c;扩展信号处理能力。FMC连接器也满足标准规范&#xff0c;可以插入标准的FMC或FMC子板。模块为100%国…

STM32_HAL库提高中断执行效率

目录 中断流程分析我的解决办法优缺点 大家都在说STM32 HAL 库中断效率低下。具体哪里不行&#xff1f;如何优化&#xff1f; 我手里的项目要用到多个定时器TIM6、TIM7、TIM9、TIM10、TIM11、TIM12、TIM13&#xff0c;在处理这些定时器中断的时候&#xff0c;也发现了这个问题。…

RabbitMQ惰性队列的工作原理、消息持久化机制、同步刷盘的概念、延迟插件的使用方法

惰性队列工作原理 惰性队列通过尽可能多地将消息存储到磁盘上来减少内存的使用。与传统队列相比&#xff0c;惰性队列不会主动将消息加载到内存中&#xff0c;而是尽量让消息停留在磁盘上&#xff0c;从而降低内存占用。尽管如此&#xff0c;它并不保证所有操作都是同步写入磁…

Spark Core(二)

Spark-Core编程&#xff08;二&#xff09; RDD转换算子 RDD 根据数据处理方式的不同将算子整体上分为 Value 类型、双 Value 类型和 Key-Value 类型 Value类型 1&#xff09;map 将处理的数据逐条进行映射转换&#xff0c;这里的转换可以是类型的转换&#xff0c;也可以是…

C#打开文件及目录脚本

如果每天开始工作前都要做一些准备工作&#xff0c;比如打开文件或文件夹&#xff0c;我们可以使用代码一键完成。 using System.Diagnostics; using System.IO;namespace OpenFile {internal class Program{static void Main(string[] args){Console.WriteLine("Hello, …

Python生成exe

其中的 -w 参数是 PyInstaller 用于窗口模式&#xff08;Windowed mode&#xff09;&#xff0c;它会关闭命令行窗口的输出&#xff0c;这通常用于 图形界面程序&#xff08;GUI&#xff09;&#xff0c;比如使用 PyQt6, Tkinter, PySide6 等。 所以&#xff1a; 如果你在没有…

【大模型微调】如何解决llamaFactory微调效果与vllm部署效果不一致如何解决

以下个人没整理太全 一、生成式语言模型的对话模板介绍 使用Qwen/Qwen1.5-0.5B-Chat训练 对话模板不一样。回答的内容就会不一样。 我们可以看到例如qwen模型的tokenizer_config.json文件&#xff0c;就可以看到对话模板&#xff0c;一般同系列的模型&#xff0c;模板基本都…

Linux网络编程——详解网络层IP协议、网段划分、路由

目录 一、前言 二、IP协议的认识 1、什么是IP协议&#xff1f; 2、IP协议报头 三、网段划分 1、初步认识IP与路由 2、IP地址 I、DHCP动态主机配置协议 3、IP地址的划分 I、CIDR设计 II、子网数目的计算 III、子网掩码的确定 四、特殊的IP地址 五、IP地址的数量限…

ansible+docker+docker-compose快速部署4节点高可用minio集群

目录 github项目地址 示例服务器列表 安装前 修改变量文件group_vars/all.yml 修改ansible主机清单 修改setup.sh安装脚本 用法演示 安装后验证 github项目地址 https://github.com/sulibao/ansible_minio_cluster.git 示例服务器列表 安装前 修改变量文件group_var…

MySql主从相关概念

想象一下&#xff0c;你的业务飞速增长&#xff0c;用户请求如潮水般涌来&#xff0c;突然数据库主库宕机&#xff0c;数据丢失&#xff0c;服务瘫痪——这简直是开发者的噩梦&#xff01;MySQL主从复制就像一张安全网&#xff0c;通过主库写、从库读的协作模式&#xff0c;不仅…

机械臂只有位置信息是否可以进行手眼标定?

平常我在做手眼标定时&#xff0c;一般都是通过OpenCV的cv::calibrateHandEye函数进行求解&#xff0c;需要输入多组不同的机械臂位姿。今天遇到了一款舵机机器人&#xff0c;只能获取位置&#xff0c;得不到姿态信息&#xff0c;想着那就把姿态都设为0&#xff0c;结果求不出来…

华为数字芯片机考2025合集2已校正

单选 1. 题目内容 关于亚稳态的描述错误的是&#xff08; &#xff09;。 1. 解题步骤 1.1 理解亚稳态&#xff08;Metastability&#xff09;的核心特性 亚稳态是指触发器无法在指定时间内稳定输出有效逻辑电平&#xff08;0或1&#xff09;的状态&#xff0c;其关键特点…

T-Box车载系统介绍及其应用

定义 T-Box汽车系统&#xff0c;全称为Telematics - BOX&#xff0c;也常简称为车载T - BOX&#xff0c;是汽车智能系统及车联网系统中的核心组成部分&#xff0c;是安装在车辆上的一种高科技远程信息处理器。 工作原理 T-Box的核心功能主要通过MPU和MCU实现。MPU负责应用程序功…

[redis进阶一]redis的持久化(1)RDB篇章

目录 一 认识持久化 (1)先看总结图 (2)什么是持久化? (3)redis是怎么进行持久化的呢 (4)简单分析一下RDB持久化和AOF持久化的不同 二 RDB持久化 (1)RDB的触发机制 (2)RDB的bgsave执行流程 (3)RDB文件的处理 (4)RDB的优缺点 (5)RDB效果演示板书 三 温习Linux文件…

uniapp日常总结--uniapp页面跳转方式

uniapp日常总结--uniapp页面跳转方式_uniapp 跳转-CSDN博客

《汽车电器与电子技术》实验报告

SRS系统结构原理与故障检测诊断 车辆上为什么要配安全气囊&#xff1f;——解析汽车被动安全的关键防线 一、安全气囊的核心作用&#xff1a;应对高速碰撞的“救命缓冲垫” 车辆在高速碰撞时&#xff08;如正面碰撞、侧面碰撞&#xff09;&#xff0c;人体会因惯性以极高速度…

ffmpeg编解码器相关函数

文章目录 &#x1f3af; 你需要理解的核心结构体&#xff1a;&#x1f4e6; 常用函数及使用顺序&#xff08;以解码为例&#xff09;1️⃣ avcodec_find_decoder() / avcodec_find_encoder()2️⃣ avcodec_alloc_context3()3️⃣ avcodec_parameters_to_context()4️⃣ avcodec…

尚硅谷2019版Java网络编程笔记

第14章 网络编程 网络编程概述 什么是网络编程&#xff1f; 网络编程是通过网络协议实现计算机之间的数据交换。Java提供了强大的网络编程支持&#xff0c;隐藏了底层细节&#xff0c;开发者可以轻松实现网络通信。 网络编程的核心问题 如何定位网络上的主机&#xff1a;通…

解决【远程主机可能不符合 glibc 和 libstdc++ Vs code 服务器的先决条件】

可能是因为vscode不支持远程操作系统的版本&#xff0c;要么升级操作系统要么回退vscode版本 vscode回退1.97版本下载地址&#xff1a; 1.97版本VSCODE

forms+windows添加激活水印

formswindows添加激活水印 多语言水印文本&#xff0c;根据系统语言自动切换。水印显示在每个屏幕的右下角&#xff0c;位置动态调整。半透明灰色文字&#xff0c;微软雅黑字体。窗口无边框、置顶、透明背景&#xff0c;不干扰用户操作。支持多显示器。高DPI适配。 效果图&am…