专栏文章 【连载 02】多线程实现

FunTester · 2024年11月28日 · 最后由 FunTester 回复于 2024年12月02日 · 3707 次阅读

Java 多线程实现

Java 多线程有多种实现方式,在测试工作中最常用的有两种:

  1. 继承 java.lang.Thread
  2. 实现 java.lang.Runnable 接口

1. 继承 Thread

通过继承 java.lang.Thread 实现 Java 多线程的步骤如下:

  1. 定义一个继承自 Thread 的子类,并重写 run() 方法。
  2. run() 方法中编写多线程执行的代码逻辑。
  3. 创建 Thread 子类的实例,调用 start() 方法启动新线程。

示例代码

package org.funtester.performance.books.chapter01.section2;

/**
 * 继承 {@link Thread} 实现 Java 多线程 
 */
public class FunThreadFirst extends Thread {

    /**
     * 主线程
     * @param args
     */
    public static void main(String[] args) {
        new FunThreadFirst().start(); // 启动线程
        System.out.println("Hello FunTester!    " + Thread.currentThread().getName()); // 打印线程名称
    }

    /**
     * 重写 {@link Thread#run()} 方法
     */
    @Override
    public void run() {
        try {
            Thread.sleep(100); // 睡眠 100 毫秒
        } catch (InterruptedException e) {
            e.printStackTrace(); // 打印异常堆栈
        }
        System.out.println("Hello FunTester!    " + Thread.currentThread().getName()); // 打印线程名称
    }
}

控制台输出

Hello FunTester!    main
Hello FunTester!    Thread-0

我们在 run() 方法中增加了 100ms 的休眠,这样 main 线程的输出会优先于我们创建的多线程 Thread-0 输出,表明 main 线程与 Thread-0 是并发执行的,非阻塞。

2. 实现 Runnable 接口

通过实现 java.lang.Runnable 接口实现 Java 多线程的步骤如下:

  1. 定义一个类,并实现 Runnable 接口的 run() 方法。
  2. run() 方法中编写多线程执行逻辑。
  3. 创建 Runnable 实现类对象,并传递给 Thread 构造方法创建线程对象,然后启动线程。

示例代码

package org.funtester.performance.books.chapter01.section2;

/**
 * 实现 {@link Runnable} 接口实现 Java 多线程
 */
public class FunThreadSecond implements Runnable {

    /**
     * 主线程
     * @param args
     */
    public static void main(String[] args) {
        FunThreadSecond second = new FunThreadSecond(); // 创建 Runnable 实例
        new Thread(second).start(); // 启动线程
        System.out.println("Hello FunTester!    " + Thread.currentThread().getName()); // 打印线程名称
    }

    /**
     * 重写 {@link Runnable#run()} 方法
     */
    @Override
    public void run() {
        try {
            Thread.sleep(100); // 睡眠 100 毫秒
        } catch (InterruptedException e) {
            e.printStackTrace(); // 打印异常堆栈
        }
        System.out.println("Hello FunTester!    " + Thread.currentThread().getName()); // 打印线程名称
    }
}

控制台输出

Hello FunTester!    main
Hello FunTester!    Thread-0

同样地,输出顺序表明两个线程的执行代码相互不干扰,是非阻塞的。

3. 使用 Lambda 表达式实现多线程

在 Java 8 中,可以使用 Lambda 表达式实现多线程。这种方式是实现 Runnable 接口的简化变种,语法更加简洁,在后续线程池中使用时也非常常见。

示例代码

package org.funtester.performance.books.chapter01.section2;

/**
 * 使用 Lambda 表达式实现 Java 多线程
 */
public class FunThreadThird {

    /**
     * 主线程
     * @param args
     */
    public static void main(String[] args) {
        new Thread(() -> System.out.println("Hello FunTester!    " + Thread.currentThread().getName())).start(); // 创建并启动线程
        System.out.println("Hello FunTester!    " + Thread.currentThread().getName()); // 打印线程名称
    }
}

控制台输出

Hello FunTester!    main
Hello FunTester!    Thread-0

总结

  • 继承 Thread:适合需要扩展 Thread 类功能的场景,但 Java 不支持多继承,限制了类的设计。
  • 实现 Runnable 接口:更灵活,适合多个线程共享同一任务逻辑的场景。
  • 使用 Lambda 表达式:语法简洁,推荐在支持 Java 8 的项目中使用。

每种方法都有其适用场景,根据实际需求选择合适的实现方式。

书的名字:从 Java 开始做性能测试

如果本书内容对你有所帮助,希望各位多多赞赏,让我可以贴补家用。赞赏两位数可以提前阅读未公开章节。我也会尝试制作本书的视频教程,包括必要的答疑。

FunTester 原创精华
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 2 条回复 时间 点赞

CompletableFuture 用的比较多。。。,另外,一般都建议用线程池,手动 new Thread 在阿里规范中不推荐,多线程实现的方式还挺多的,比如 Callable 等。。

小狄子 回复

专业。 -- 漠 于 12 月 02 日 下午 第八时辰

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册