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

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

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

一、环境准备

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

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

二、三种创建线程的方式

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

另外,线程的生命周期可以速记为:新建(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。输出结果应该是一个正确的累加和,以及一个几毫秒到几十毫秒的耗时。

几个关键点:

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

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

实践建议:

五、调试与排错建议

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

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

本文转载于:https://www.yisu.com/ask/46319278.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。