跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
Java Runnable接口
”︁(章节)
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= Java Runnable接口 = == 介绍 == '''Runnable'''接口是Java多线程编程的核心接口之一,位于<code>java.lang</code>包中。它定义了一个单一方法<code>run()</code>,用于封装需要在独立线程中执行的代码逻辑。与直接继承<code>Thread</code>类相比,实现<code>Runnable</code>接口是更灵活的多线程实现方式,因为Java不支持多重继承,而接口可以多重实现。 == 语法定义 == Runnable接口的官方定义如下: <syntaxhighlight lang="java"> @FunctionalInterface public interface Runnable { void run(); } </syntaxhighlight> == 基本用法 == === 实现Runnable接口 === 创建一个实现Runnable接口的类,并重写<code>run()</code>方法: <syntaxhighlight lang="java"> class MyRunnable implements Runnable { @Override public void run() { System.out.println("Thread is running"); } } </syntaxhighlight> === 启动线程 === 通过Thread类启动Runnable实例: <syntaxhighlight lang="java"> public class Main { public static void main(String[] args) { Runnable task = new MyRunnable(); Thread thread = new Thread(task); thread.start(); // 启动线程 } } </syntaxhighlight> '''输出:''' <pre> Thread is running </pre> == 使用Lambda表达式 == Java 8+支持用Lambda简化实现: <syntaxhighlight lang="java"> public class LambdaExample { public static void main(String[] args) { Thread thread = new Thread(() -> System.out.println("Lambda thread running")); thread.start(); } } </syntaxhighlight> == 与Thread类的对比 == {| class="wikitable" |+ Runnable vs Thread ! 特性 !! Runnable接口 !! Thread类 |- | 继承方式 | 实现接口 | 继承类 |- | 内存开销 | 轻量(可共享实例) | 较重(每个线程独立实例) |- | 扩展性 | 可同时实现其他接口 | 单继承限制 |} == 线程生命周期图 == <mermaid> stateDiagram-v2 [*] --> New New --> Runnable: start() Runnable --> Running: 线程调度 Running --> Terminated: run()完成 Running --> Runnable: yield()/时间片用完 Running --> Blocked: 等待I/O/锁 Blocked --> Runnable: 资源可用 </mermaid> == 实际应用案例 == === 文件批量处理器 === <syntaxhighlight lang="java"> class FileProcessor implements Runnable { private String fileName; public FileProcessor(String name) { this.fileName = name; } @Override public void run() { System.out.println("Processing: " + fileName); // 模拟文件处理耗时 try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Completed: " + fileName); } } public class BatchFileDemo { public static void main(String[] args) { String[] files = {"A.txt", "B.log", "C.csv"}; for (String file : files) { new Thread(new FileProcessor(file)).start(); } } } </syntaxhighlight> '''可能的输出顺序(因线程调度而异):''' <pre> Processing: A.txt Processing: B.log Processing: C.csv Completed: A.txt Completed: B.log Completed: C.csv </pre> == 高级主题 == === 线程池中的Runnable === Executor框架更高效地管理Runnable任务: <syntaxhighlight lang="java"> import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class ThreadPoolDemo { public static void main(String[] args) { ExecutorService executor = Executors.newFixedThreadPool(3); for (int i = 1; i <= 5; i++) { Runnable worker = new Task("Task-" + i); executor.execute(worker); } executor.shutdown(); } } class Task implements Runnable { private String name; public Task(String name) { this.name = name; } @Override public void run() { System.out.println(name + " started by " + Thread.currentThread().getName()); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(name + " completed"); } } </syntaxhighlight> == 常见问题 == === Runnable没有返回值怎么办? === 如果需要获取执行结果,应使用<code>Callable</code>接口替代,它定义了<code>call()</code>方法可以返回结果。 === 如何传递参数? === 通过构造函数或setter方法向Runnable实现类传递参数,如前面的FileProcessor示例所示。 == 数学建模 == 线程执行时间可表示为: <math> T_{total} = \sum_{i=1}^{n} (T_{cpu\_i} + T_{io\_i}) </math> 其中: * <math>T_{cpu\_i}</math> = 第i个线程的CPU时间 * <math>T_{io\_i}</math> = 第i个线程的I/O等待时间 == 最佳实践 == 1. 优先选择Runnable而非继承Thread 2. 保持<code>run()</code>方法简洁 3. 处理InterruptedException 4. 避免共享可变状态 5. 使用线程池管理资源 [[Category:编程语言]] [[Category:Java]] [[Category:Java多线程]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)