如何在Java中进行多线程编程

news/2025/10/19 16:57:10/文章来源:https://www.cnblogs.com/yang520/p/19151064

在Java中进行多线程编程有多种方式,最常用的包括继承Thread类、实现Runnable接口、实现Callable接口,以及使用线程池等。以下是具体介绍和代码示例:

1. 继承Thread类

通过继承Thread类并重写run()方法来定义线程执行逻辑,然后调用start()方法启动线程。

// 继承Thread类
class MyThread extends Thread {@Overridepublic void run() {for (int i = 0; i < 5; i++) {System.out.println("线程" + Thread.currentThread().getId() + ": " + i);try {Thread.sleep(100); // 休眠100毫秒,模拟任务耗时} catch (InterruptedException e) {e.printStackTrace();}}}
}public class ThreadExample {public static void main(String[] args) {// 创建并启动线程MyThread thread1 = new MyThread();MyThread thread2 = new MyThread();thread1.start(); // 启动线程(调用run()方法)thread2.start();}
}
 
 

2. 实现Runnable接口

实现Runnable接口的run()方法,将任务逻辑与线程分离,更灵活(可避免单继承限制)。

// 实现Runnable接口
class MyRunnable implements Runnable {@Overridepublic void run() {for (int i = 0; i < 5; i++) {System.out.println("线程" + Thread.currentThread().getId() + ": " + i);try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}}}
}public class RunnableExample {public static void main(String[] args) {// 创建任务实例MyRunnable task = new MyRunnable();// 通过Thread包装任务并启动Thread thread1 = new Thread(task);Thread thread2 = new Thread(task);thread1.start();thread2.start();}
}
 
 

3. 实现Callable接口(带返回值)

Callable接口与Runnable类似,但call()方法可以返回结果并抛出异常,通常配合Future使用。

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;// 实现Callable接口(泛型指定返回值类型)
class MyCallable implements Callable<Integer> {private int taskId;public MyCallable(int taskId) {this.taskId = taskId;}@Overridepublic Integer call() throws Exception {int sum = 0;for (int i = 0; i <= 10; i++) {sum += i;Thread.sleep(50);}System.out.println("任务" + taskId + "执行完毕,结果为:" + sum);return sum; // 返回计算结果}
}public class CallableExample {public static void main(String[] args) throws ExecutionException, InterruptedException {// 创建Callable任务MyCallable task1 = new MyCallable(1);MyCallable task2 = new MyCallable(2);// 用FutureTask包装Callable(可获取结果)FutureTask<Integer> future1 = new FutureTask<>(task1);FutureTask<Integer> future2 = new FutureTask<>(task2);// 启动线程new Thread(future1).start();new Thread(future2).start();// 获取任务结果(会阻塞直到任务完成)int result1 = future1.get();int result2 = future2.get();System.out.println("主线程获取结果:" + result1 + "," + result2);}
}
 
 

4. 使用线程池(推荐)

频繁创建销毁线程会消耗资源,线程池可以复用线程,提高效率。Java通过ExecutorsThreadPoolExecutor创建线程池。

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class ThreadPoolExample {public static void main(String[] args) {// 创建固定大小的线程池(3个线程)ExecutorService executor = Executors.newFixedThreadPool(3);// 提交5个任务到线程池for (int i = 0; i < 5; i++) {final int taskId = i;executor.submit(() -> {// 使用Lambda表达式简化RunnableSystem.out.println("任务" + taskId + "由线程" + Thread.currentThread().getId() + "执行");try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}});}// 关闭线程池(不再接受新任务,等待现有任务完成)executor.shutdown();}
}
 
 

核心概念补充

  • 线程状态:新建(New)→ 就绪(Runnable)→ 运行(Running)→ 阻塞(Blocked/Waiting/Timed Waiting)→ 终止(Terminated)。
  • 线程同步:多线程共享资源时需避免竞争,可使用synchronized关键字、Lock接口等实现同步。
  • 线程通信:通过wait()notify()notifyAll()等方法实现线程间协作。

线程池是实际开发中推荐的方式,因为它能更好地管理线程资源,避免频繁创建线程的开销。

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

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

相关文章

Java中java.util.Random的用法

java.util.Random是Java中用于生成伪随机数的类,提供了多种生成不同类型随机数的方法。 基本用法 1. 创建Random对象 import java.util.Random;// 创建Random对象(使用默认种子,通常是系统时间) Random random = n…

我的学习开始及历程

学习嵌入式 Linux 驱动的历程回顾第一篇的随笔中我写到:「带来更多的体会和收获,就不会是毫无意义的普通文字了。」 所以就当作重新梳理自己来写这个随笔了。嵌入式的开始接触 大约是大一的时候,比较疯狂的「迷恋」…

2025年磨粉机厂家推荐排行榜,雷蒙磨粉机,环辊磨粉机,摆式磨粉机,矿石磨粉机,超微磨粉机,高压磨粉机公司推荐!

2025年磨粉机厂家推荐排行榜:雷蒙磨粉机、环辊磨粉机、摆式磨粉机、矿石磨粉机、超微磨粉机、高压磨粉机公司推荐!随着工业技术的不断进步,磨粉机在矿业、化工、建材等多个领域发挥着越来越重要的作用。为了帮助企业…

Java基础语法与面向对象

什么是重载(Overload)和重写(Override)?有什么区别?重载(Overload):同一类中,方法名相同但参数列表不同(参数类型、个数、顺序不同),与返回值无关。重写(Override):子类继承父类后,对父类的方法进行重…

从汇编角度看C++优化:编译器真正做了什么 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

实用指南:【从零开始学习RabbitMQ】

实用指南:【从零开始学习RabbitMQ】pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monac…

Godot-C#处理节点关系

Godot C#处理节点关系 简介 我们知道在游戏中,任何事物都可以看做一个节点,而节点之间的关系可以帮助我们更好的管理游戏世界。Godot中,节点之间的关系可以分为两种:父子关系和兄弟关系。godot已经提供了现成的方法…

2025信息流代运营推荐:线尚网络精准投放,效果显著!

2025信息流代运营推荐:线尚网络精准投放,效果显著!随着互联网技术的飞速发展,信息流广告已成为企业营销的重要手段。然而,信息流代运营领域也面临着诸多技术挑战和数据问题。本文将深入探讨当前信息流代运营领域的…

零售行业绩效流程推行难点及 Tita 目标绩效一体化管理方案

在零售行业,市场环境瞬息万变,顾客需求日益多样化,使得绩效流程的推行充满挑战。要想在激烈竞争中脱颖而出,企业需借助高效工具实现目标绩效一体化管理,Tita 平台便是有力助手,能有效攻克常见难点。 零售行业绩效…

CTFHub 信息泄露通关笔记4:备份文件下载 bak文件 - 教程

CTFHub 信息泄露通关笔记4:备份文件下载 bak文件 - 教程2025-10-19 16:39 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important;…

软件工程-结队项目

软件工程-结队项目软件工程结队项目 项目参与成员 计科三班 3123006072 郭涛 计科三班 3123004548 袁智燊这个作业属于哪个课程 <https://edu.cnblogs.com/campus/gdgy/SoftwareEngineering2024>这个作业要求在哪…

go 并发赋值安全性

go 并发赋值安全性32/64位机器读写占用空间小于或等于32/64位的变量是原子操作,超过时属于非原子操作。 安全的赋值类型基本数据类型:字节型、布尔型、整型、浮点型、字符型其他数据类型:指针、函数 不安全的赋值类…

《探索C语言中数组的奥秘(下)》 - 教程

《探索C语言中数组的奥秘(下)》 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "M…

Vue中keep-alive实现原理解析

Vue中keep-alive的实现原理 什么是keep-alive keep-alive是Vue内置的一个抽象组件,用于保留组件状态或避免重新渲染。它不会在DOM树中渲染成任何实际的标签,只是将其包裹的组件实例缓存起来。 核心实现原理 1. 基于L…

2025 年防撞钢护栏厂家推荐聊城市泰锌金属材料有限公司,桥梁,不锈钢,复合管,景观,灯光,热镀锌,河道,铝合金,绳索防撞钢护栏公司推荐

行业背景随着城市化进程加速和基础设施建设持续推进,交通安全设施市场迎来稳步增长期。据行业报告显示,2025 年全球栏杆围栏市场规模有望持续扩大,其中防撞护栏作为道路安全的核心保障设施,需求尤为旺盛。在高速公…

[转]学习指南 - PL-600:Microsoft Power Platform 解决方案架构师

[转]学习指南 - PL-600:Microsoft Power Platform 解决方案架构师exam ref MICROSOFT PL-600 - Microsoft Power Platform Solution Architect : Free Premium Exam Material | CertyIQ PL-600 Exam - Free Actual …

2025年聚氨酯制品厂家推荐排行榜,浇注型聚氨酯,聚氨酯预聚体,聚氨酯胶黏剂,聚氨酯组合料,液体聚氨酯,专业品质与创新技术之选

2025年聚氨酯制品厂家推荐排行榜,浇注型聚氨酯,聚氨酯预聚体,聚氨酯胶黏剂,聚氨酯组合料,液体聚氨酯,专业品质与创新技术之选随着工业和制造业的快速发展,聚氨酯制品在各个领域的应用越来越广泛。从浇注型聚氨酯…

Java异步编程难题拆解

在当今高并发、大数据量的应用场景下,同步编程模式常常会致使线程阻塞,对系统性能和响应速度造成严重影响。Java异步编程借助非阻塞方式执行任务,能显著提升系统的吞吐量和资源利用率。不过,异步编程牵涉复杂的线程…

三场比赛(二)

0.前言 最近三场比赛不止有三场。 1.正文 比赛 如果每场单独写再加上杂题等等的话就有点太多了,而且比赛间能看出一些共同的东西,所以就一起写了。 优点发挥较为稳定。该想出来的简单题都能想出来,该会做的原题都能…

深入学习Spring Boot框架

一、引言 Spring Boot是一个基于Spring框架的快速应用开发框架,它极大地简化了新Spring应用的初始搭建及开发过程。通过“约定优于配置”的理念,Spring Boot减少了大量样板代码和繁琐配置,让开发者能够更专注于业务…