当前位置:

首页 > 编程开发 > Java在Ubuntu上的多线程编程教程

Java在Ubuntu上的多线程编程教程

在Ubuntu系统安装OpenJDK后,可通过继承Thread类、实现Runnable接口或使用Executor框架创建线程,共有三种常见方式。线程生命周期包括新建、就绪、运行、阻塞、终止五个阶段。线程池配合Callable与Future实现并行计算,并利用synchronized关键字和Lock锁等同步机制保障数据安全。

在 Ubuntu 上进行 Ja va 多线程编程的入门与实战教程

Ja va在Ubuntu上的多线程编程教程

先说一个很实在的判断:如果你在 Ubuntu 上写 Ja va 多线程程序,环境准备其实比想象中简单得多,真正需要花心思的,是理解线程的创建方式、生命周期管理,以及如何安全地共享数据。下面咱们就从最基础的环境搭建开始,一步步深入到实战代码,最后再聊聊调试和排错那些事儿。

一、环境准备

在 Ubuntu 上开发 Ja va 多线程,核心就是装好 JDK,然后会用 ja vac/ja va 命令。推荐使用 OpenJDK 17 或 21 LTS,稳定性有保障。

  • 安装 OpenJDK:先更新索引再安装,一句命令搞定:sudo apt update && sudo apt install openjdk-17-jdk
  • 验证安装:ja va -version 和 ja vac -version 两个命令都能正常输出版本信息就算成功。
  • 可选配置 JA VA_HOME:有些工具(比如 Ma ven、Gradle)需要这个环境变量。查找路径:update-alternatives --config ja va,然后写进 ~/.bashrc,记得 source ~/.bashrc 使其生效。

一句话总结:装上 JDK,配好路径,其他 Linux 发行版上的经验完全通用。

二、三种创建线程的方式

创建线程的方式很多,但主流就三种,各有各的适用场景。

  • 方式一:继承 Thread
    重写 run() 方法,然后调用 start() 启动新线程。简单粗暴,适合快速验证思路,但生产代码里不推荐,因为继承破坏了灵活性。
  • 方式二:实现 Runnable
    任务和线程对象解耦,同一个 Runnable 实例可以丢给多个线程执行,复用性更好。实际项目中更推荐这种方式。
  • 方式三:使用 Executor 框架(强烈推荐)
    通过 ExecutorService 管理线程生命周期,支持 Runnable、Callable、Future,还能方便地获取返回值和处理异常。这是现代 Ja va 并发编程的标配。

另外,线程的生命周期可以速记为:新建(New)→ 就绪(Runnable)→ 运行(Running)→ 阻塞(Blocked)→ 终止(Terminated)。记住这个流转图,调试时能帮你快速定位问题。

三、完整示例:线程池 + Callable + Future + 同步

光说不练假把式,来看一个真实可跑的代码。这个例子用固定线程池并行计算 1 到 N 的累加和,演示了 Callable、Future、线程安全计数以及优雅关闭。

import ja va.util.concurrent.*;

public class ThreadPoolSum {
    // 线程安全计数器
    static class Counter {
        private final Object lock = new Object();
        private int n = 0;
        void add(int delta) { synchronized (lock) { n += delta; } }
        int get() { synchronized (lock) { return n; } }
    }

    static class SumTask implements Callable {
        private final long from, to;
        SumTask(long from, long to) { this.from = from; this.to = to; }
        @Override public Long call() {
            long sum = 0;
            for (long i = from; i <= to; i++) sum += i;
            // 模拟少量 I/O 或计算抖动
            try { Thread.sleep(1); } catch (InterruptedException ignored) {}
            return sum;
        }
    }

    public static void main(String[] args) throws Exception {
        int n = 1_000_000;
        int threads = Runtime.getRuntime().a vailableProcessors(); // 贴近 CPU 核心数
        ExecutorService exec = Executors.newFixedThreadPool(threads);
        long t0 = System.nanoTime();

        Future[] futures = new Future[threads];
        long chunk = n / threads;
        for (int i = 0; i < threads; i++) {
            long from = i * chunk + 1;
            long to = (i == threads - 1) ? n : (i + 1) * chunk;
            futures[i] = exec.submit(new SumTask(from, to));
        }

        long total = 0;
        for (Future f : futures) total += f.get(); // 阻塞等待结果
        long t1 = System.nanoTime();

        exec.shutdown();
        exec.awaitTermination(10, TimeUnit.SECONDS);
        System.out.printf("Sum[1..%d] = %d, 耗时 %.3f ms%n", n, total, (t1 - t0) / 1_000_000.0);
    }
}

编译运行:ja vac ThreadPoolSum.ja va 然后 ja va ThreadPoolSum。输出结果应该是一个正确的累加和,以及一个几毫秒到几十毫秒的耗时。

几个关键点:

  • 用 ExecutorService 管理线程,避免频繁创建/销毁线程的开销。
  • Callable/Future 可以获取任务返回值,同时 Future.get() 会抛出异常,方便处理任务中的错误。
  • 共享数据(比如这里的 Counter)使用 synchronized 保证线程安全,或者直接用 ja va.util.concurrent 包里的原子类。

四、线程安全与常见并发工具

多线程编程的核心难点从来不是“怎么启动线程”,而是“怎么让多个线程安全地协作”。下面这些工具你得熟悉。

  • 同步机制
    • synchronized 方法/代码块:最基础的互斥锁,保证同一时刻只有一个线程进入临界区。
    • ReentrantLock:显式锁,支持尝试锁、超时、公平锁等更灵活的语义,适合复杂场景。
  • 并发容器
    • ConcurrentHashMap、CopyOnWriteArrayList 等,在高并发读写场景下比传统容器更安全、更高效。
  • 同步辅助类
    • CountDownLatch 用于等待一组线程完成,CyclicBarrier 用于多线程互相等待,Semaphore 用于限流。

实践建议:

  • 优先使用 Executor 框架和并发容器,少手动 new Thread。
  • 明确共享可变状态的访问边界,尽量缩小同步范围。
  • 正确处理 InterruptedException,不能悄悄吞掉,至少也要恢复中断标记。
  • 任务拆分粒度与线程数要匹配:CPU 密集型任务,线程数接近 CPU 核心数;I/O 密集型任务,可以适当增加线程数以提升吞吐量。

五、调试与排错建议

多线程程序一旦出了问题,排查起来往往比单线程麻烦得多。这里分享几个实用技巧。

  • 用 IDE 的断点与线程视图观察线程状态、锁竞争和调用栈,比单纯看日志直观很多。
  • 添加日志时带上线程名和时间戳,能帮你还原并发时序。
  • 用 jstack 抓取 Ja va 线程转储,分析死锁、阻塞和热点。
  • 对共享可变状态进行最小化共享,优先使用不可变对象或线程安全容器。
  • 单元测试 + 压力测试结合,覆盖边界与异常路径,验证线程安全与性能回归。

最后提醒一句:多线程的坑往往藏在“看起来没问题”的代码里,多测、多压、多分析,才能写出真正健壮的并发程序。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
作者最新文章
编程开发 Ubuntu
相关文章 更多
ServBay安装配置详细教程与操作指南
ServBay安装配置详细教程与操作指南

新手入门 ServBay 本地开发环境,详解安装包下载、Dashboard 状态监控、Packages 组件安装、Services 服务控制及 Websites 项目配置。掌握 .servbay.config 版本管理与日志排查技巧,快速搭建稳定的 PHP、Node.js 等多语言开发环境。

codekit环境配置指南从安装到环境搭建完整教程
codekit环境配置指南从安装到环境搭建完整教程

详解 CodeKit 在 macOS 下的安装步骤、项目导入方法、Sass与JavaScript编译设置及浏览器自动刷新功能,助您快速搭建高效的前端开发环境。

codex安装windows 命令行完整操作教程
codex安装windows 命令行完整操作教程

详解Windows环境下安装OpenAI Codex CLI的步骤,包括WSL环境检查、Node.js/npm配置、npm全局安装命令及首次启动验证,适合开发者快速上手。

NativeRest环境配置要求与完整操作教程
NativeRest环境配置要求与完整操作教程

学习如何配置 NativeRest REST API 客户端。涵盖 Windows/macOS/Linux 安装后的工作区创建、环境变量管理、请求编辑及响应查看步骤,帮助开发者快速完成基础环境搭建与连通性测试。

CSS设置透明度的注意事项有哪些?opacity属性详解
CSS设置透明度的注意事项有哪些?opacity属性详解

深入解析CSS中设置透明度的核心属性opacity,剖析子元素继承、事件穿透、层叠上下文等关键注意事项,并提供与rgba、hsla的实用选型对比。

flutter页面传值到后台的方法及示例代码
flutter页面传值到后台的方法及示例代码

flutter页面传值到后台的完整实现方法及示例代码,帮助读者快速掌握相关技术要点。

Java 8至21新特性代码写法对比:Lambda、Record与Switch
Java 8至21新特性代码写法对比:Lambda、Record与Switch

本文通过具体的旧版与新版代码对比,详细剖析Java 8引入的Lambda表达式、Java 14/16引入的Record类,以及Java 12至21逐步演进完善的Switch表达式与模式匹配,展示代码简化路径与避坑要点。

AI智能体开发培训课程学什么及实战内容介绍
AI智能体开发培训课程学什么及实战内容介绍

系统梳理AI智能体开发培训的核心知识模块、技术栈选型与典型实战项目,解析低代码平台与纯代码框架的差异,提供从零构建可落地智能体的完整学习与实施路径。

Java子类未实现抽象方法编译错误修复指南
Java子类未实现抽象方法编译错误修复指南

针对Java开发中常见的“子类未实现抽象方法”编译错误,深入分析报错原因,提供重写实现、声明抽象子类两种标准修复路径,并总结参数签名、访问修饰符等典型避坑要点。

解决PHP递归报错:max_nesting_level限制与内存溢出处理
解决PHP递归报错:max_nesting_level限制与内存溢出处理

遇到PHP递归报错时,不要盲目调大max_nesting_level。本文教你区分Xdebug限制、内存耗尽和正则递归错误,提供代码级的终止条件优化与迭代替代方案,彻底解决栈溢出问题。

查看更多
精品专题 更多
装机必备
装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows
Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

PDF教程
PDF教程

正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

Mac软件 更多
Shapr3D macOS版
Shapr3D macOS版
Mac

Shapr3D是一款面向工业设计、机械工程、建筑概念和三维打印工作流的CAD软件。Mac版采用Parasolid建模内核,支持草图约束、实体建模、工程图、可视化渲染及常见CAD格式交换,并可通过账户在多台设备之间同步项目。

REAPER macOS版
REAPER macOS版
Mac

REAPER是Cockos开发的数字音频工作站,提供多轨音频与MIDI录制、剪辑、处理、混音和母带制作工具。Mac版兼容Intel与Apple芯片,支持AU、VST、VST3、CLAP等插件格式,并提供高度可定制的工作流程。

Ableton Live macOS版
Ableton Live macOS版
Mac

Ableton Live 是面向音乐制作人与现场表演者的数字音频工作站,提供编曲视图、独具特色的现场视图、音频录制、MIDI创作、实时变速、乐器及效果器。Mac版原生支持Apple芯片,并可连接音频接口、MIDI控制器和第三方插件。

WINDOWS 更多
3dmax(3ds max)
3dmax(3ds max)
Windows

Autodesk 3ds Max 是一款专业的三维建模、动画与渲染软件,广泛应用于建筑可视化、游戏开发、影视动画、广告设计和产品展示等领域。

photoshop
photoshop
Windows、macOS 、 iPad

Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。

Blender
Blender
Windows、macOS 和 Linux

Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。