跳至主要內容

Java多线程教程:Runnable接口

程序猿DD原创JavaJava大约 3 分钟

Java多线程教程:Runnable接口

Java中的Runnable接口是一个函数式接口,用于定义可被线程执行的任务。它提供了一种定义并发执行任务的方式,常与Thread类或java.util.concurrent包中的执行器结合使用。

目录

  1. Runnable接口概述
  2. 实现Runnable
  3. 运行Runnable
  4. 示例:实现并运行Runnable
  5. 结合Executor使用Runnable
  6. 使用Lambda表达式简化Runnable
  7. 使用Runnable的优势
  8. 结论

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接口的使用对编写并发应用至关重要。

上次编辑于:
贡献者: 程序猿DD