Java多线程教程:Runnable接口
原创大约 3 分钟
Java多线程教程:Runnable接口
Java中的Runnable
接口是一个函数式接口,用于定义可被线程执行的任务。它提供了一种定义并发执行任务的方式,常与Thread
类或java.util.concurrent
包中的执行器结合使用。
目录
- Runnable接口概述
- 实现Runnable
- 运行Runnable
- 示例:实现并运行Runnable
- 结合Executor使用Runnable
- 使用Lambda表达式简化Runnable
- 使用Runnable的优势
- 结论
1. Runnable接口概述
Runnable
接口是一个单方法接口,仅定义了run()
方法,该方法包含线程要执行的任务代码。
public interface Runnable {
void run();
}
2. 实现Runnable
要创建Runnable任务,需定义一个类实现Runnable
接口并实现run()
方法。
示例:
class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("Runnable任务正在运行。");
}
}
3. 运行Runnable
运行Runnable任务有两种常见方式:
- 通过
Thread
类 - 通过
java.util.concurrent
包中的执行器
通过Thread类运行:
public class RunnableExample {
public static void main(String[] args) {
MyRunnable myRunnable = new MyRunnable();
Thread thread = new Thread(myRunnable);
thread.start(); // 启动线程
}
}
4. 示例:实现并运行Runnable
完整示例:
class MyRunnable implements Runnable {
@Override
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName() + " 正在运行。计数:" + i);
try {
Thread.sleep(1000); // 通过睡眠模拟工作
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class RunnableExample {
public static void main(String[] args) {
MyRunnable myRunnable = new MyRunnable();
Thread thread1 = new Thread(myRunnable);
Thread thread2 = new Thread(myRunnable);
thread1.start();
thread2.start();
}
}
输出:
Thread-0 正在运行。计数:0
Thread-1 正在运行。计数:0
Thread-0 正在运行。计数:1
Thread-1 正在运行。计数:1
...(后续计数交替输出)
说明:
MyRunnable
类实现Runnable
接口并覆盖run()
方法。- 创建两个
Thread
对象,共享同一个MyRunnable
实例。 - 两个线程并发执行
run()
方法。
5. 结合Executor使用Runnable
java.util.concurrent
包提供ExecutorService
接口和线程池实现,能更灵活高效地管理线程。
示例:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
class MyRunnable implements Runnable {
@Override
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName() + " 正在运行。计数:" + i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class RunnableWithExecutorExample {
public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(2);
MyRunnable myRunnable = new MyRunnable();
executorService.submit(myRunnable);
executorService.submit(myRunnable);
executorService.shutdown();
}
}
输出:
pool-1-thread-1 正在运行。计数:0
pool-1-thread-2 正在运行。计数:0
pool-1-thread-1 正在运行。计数:1
pool-1-thread-2 正在运行。计数:1
...(后续计数交替输出)
说明:
- 创建一个包含2个线程的固定线程池。
- 提交两个
MyRunnable
任务到执行器。 - 线程池中的线程并发执行
run()
方法。
6. 使用Lambda表达式简化Runnable
Java 8引入Lambda表达式后,可更简洁地创建Runnable实例。
示例:
public class RunnableWithLambdaExample {
public static void main(String[] args) {
Runnable task = () -> {
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName() + " 正在运行。计数:" + i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
Thread thread1 = new Thread(task);
Thread thread2 = new Thread(task);
thread1.start();
thread2.start();
}
}
输出:
Thread-0 正在运行。计数:0
Thread-1 正在运行。计数:0
...(后续计数交替输出)
说明:
- 使用Lambda表达式直接定义Runnable的
run()
方法。 - 创建两个
Thread
对象执行同一任务。
7. 使用Runnable的优势
- 任务与执行解耦:任务逻辑与执行线程分离。
- 设计灵活性:类可在实现Runnable的同时继承其他类。
- 支持线程池:可与Executor框架结合,优化线程管理。
- 代码简洁性:结合Lambda表达式减少冗余代码。
8. 结论
Runnable
接口是Java多线程编程的核心工具,通过实现该接口,可定义能被线程或线程池执行的任务。结合Java 8的Lambda表达式,代码更简洁高效。掌握Runnable接口的使用对编写并发应用至关重要。