「原创声明:保留所有权利,禁止转载」
Java 多线程实现
Java 多线程有多种实现方式,在测试工作中最常用的有两种:
- 继承
java.lang.Thread
类 - 实现
java.lang.Runnable
接口
1. 继承 Thread
类
通过继承 java.lang.Thread
实现 Java 多线程的步骤如下:
- 定义一个继承自
Thread
的子类,并重写run()
方法。 - 在
run()
方法中编写多线程执行的代码逻辑。 - 创建
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 多线程的步骤如下:
- 定义一个类,并实现
Runnable
接口的run()
方法。 - 在
run()
方法中编写多线程执行逻辑。 - 创建
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 原创精华
TesterHome 为用户提供「保留所有权利,禁止转载」的选项。
除非获得原作者的单独授权,任何第三方不得转载标注了「原创声明:保留所有权利,禁止转载」的内容,否则均视为侵权。
具体请参见TesterHome 知识产权保护协议。
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!