
本文共 2349 字,大约阅读时间需要 7 分钟。
一、什么是Future模式?
Future模式是一种并发编程模式,核心思想是通过已完成任务的方式,去除主函数的等待时间。想象一下,你在饭店等上菜的时候,如果将这段等待时间用于阅读、写作,或者与周围人交流,那么这段时间就不再是“等待”的简单耗时,而是充分利用了时间的 bleach time(空闲时间)。就像并行下载多个文件一样,多个任务在同一时间段内多线程执行,从而提高整体效率。
Future模式的工作原理其实类似于异步编程。在单线程环境下,如果有多个任务需要同时执行,我们可以通过将这些任务分别提交执行,并通过Future对象关联这些并行执行的任务。当某个任务完成时,Future对象会立即通知我们,可以根据需要进行处理。这种方式一方面避免了多线程中的死锁问题(_deadlock),另一方面充分利用了 CPU 的 idle time(空闲时间),提升了资源利用率。
三、Future模式的核心优势
异步化处理:通过Future模式,我们可以像处理同步函数一样处理异步返回的任务。这种看似复杂的非线性控制结构,最终可以变成简洁的同步代码。
代码简化:类似于 Deferred 模式,Future允许我们通过简单的 Future.get() 或 Future.isDone() 来处理多个依赖任务,从而简化了代码的叠加式编程。
Resource optimization:通过并行执行多个任务,充分利用 CPU 的空闲时间,可以显著提升整体工作效率。在假设两位执行时间分别为5秒和6秒的任务,那么采用普通模式需要11秒才能完成。而通过Future实现,整体完成时间仅仅为6秒。
四、代码示例
以下是Future模式的典型使用方法:
package com;
import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.concurrent.*;/**
-
- {Desc} */
public class ThreadCallable { public static void main(String[] args) throws InterruptedException, ExecutionException { List task = new ArrayList(); // 创建不定长线程池 ExecutorService executorService = Executors.newCachedThreadPool();
// 第一任务:5秒延迟executorService.submit(new Callable() { public Object call() throws Exception { System.out.println("延时5秒开始"); Thread.sleep(5000); System.out.println("延时5秒结束"); return "5秒执行完啦!!!"; }});// 第二任务:6秒延迟task.add(executorService.submit(new Callable() { public Object call() throws Exception { System.out.println("延时6秒开始"); Thread.sleep(6000); System.out.println("延时6秒结束"); return "6秒执行完啦!!!"; }}));int index = 1;// 获取所有以Futrue形式执行的任务结果for (Future item : task) { Object o = item.get(); // 等待任务完成,获取返回值 System.out.println("我是第" + index + "个任务返回的结果:" + o); index++;}// 关闭线程池executorService.shutdown();System.out.println("执行时长:" + (System.currentTimeMillis() - l) / 1000 + "秒");
}
在这段代码中:
l 表示初始时间(即0秒),执行完毕的结果显示我们只需等待6秒即可完成所有任务(一个5秒,一个6秒),而 barebone模式 下则需要11秒。这样通过 Future 模式,我们将线程空闲时间充分利用,使总体效率提升到原来的1.8倍左右。
五、图示对比
下面是一张简要对比图的内容:
- 左侧为传统模式,主线程在等待任务1和任务2完成,需要累计11秒;
- 右侧为Future模式下的实现,主线程提交任务后立即返回,剩下的等待时间用于其他操作,完成时间仅为6秒。
通过 Future 模式,我们不 Only 伊rons.tasks.can Nap at 会争夺主线程的等待时间,从而在其他不会任务中获得 performance gain(性能提升)。这种设计理念在分布式系统中尤为重要,有助于充分利用网络带宽和系统资源。
六、总结性语句
Future 模式是一种观念概念,不直接改变代码本身,而是通过重要性地改变思维方式。它的核心在于转移到任务执行的本源逻辑上,而不是为了协议的执行,而是基于协议结果。通过这样的设计,可以更好地抵御代码执行时间的不确定性。
发表评论
最新留言
关于作者
