实例1:
package com.cn.test2;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class FutureTaskSample {
static FutureTask<String> future = new FutureTask(new Callable<String>() {
public String call() {
try {
Thread.sleep(3000) ;
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "testPageContent and provide that the operation is a time exhausted thing...";
}
});
public static void main(String[] args) throws InterruptedException,
ExecutionException {
// Start a thread to let this thread to do the time exhausting thing
new Thread(future).start();
// Main thread can do own required thing first
doOwnThing();
// At the needed time, main thread can get the result
System.out.println(future.get());
}
public static String doOwnThing() {
return "Do Own Thing";
}
}
实例2
package com.cn.test2;
import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class FutureTaskDemo {
public static void main(String[] args) {
// 初始化一个Callable对象和FutureTask对象
Callable pAccount = new PrivateAccount();
FutureTask futureTask = new FutureTask(pAccount);
// 使用futureTask创建一个线程
Thread pAccountThread = new Thread(futureTask);
System.out.println("futureTask线程现在开始启动,启动时间为:" + System.nanoTime());
pAccountThread.start();
System.out.println("主线程开始执行其他任务");
// 从其他账户获取总金额
int totalMoney = new Random().nextInt(100000);
System.out.println("现在你在其他账户中的总金额为" + totalMoney);
System.out.println("等待私有账户总金额统计完毕...");
// 测试后台的计算线程是否完成,如果未完成则等待
while (!futureTask.isDone()) {
try {
Thread.sleep(500);
System.out.println("私有账户计算未完成继续等待...");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("futureTask线程计算完毕,此时时间为" + System.nanoTime());
Integer privateAccountMoney = null;
try {
privateAccountMoney = (Integer) futureTask.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
System.out.println("您现在的总金额为:" + totalMoney + privateAccountMoney.intValue());
}
}
@SuppressWarnings("all")
class PrivateAccount implements Callable {
Integer totalMoney;
@Override
public Object call() throws Exception {
Thread.sleep(5000);
totalMoney = new Integer(new Random().nextInt(10000));
System.out.println("您当前有" + totalMoney + "在您的私有账户中");
return totalMoney;
}
}
分享到:
相关推荐
FutureTask用法及使用场景介绍 FutureTask是一种异步获取执行结果或取消执行任务的机制,它可以用来处理耗时的计算任务,使主线程不需要等待计算结果,而是继续执行其他任务。下面将详细介绍FutureTask的用法和使用...
在本篇文章中,我们将深入探讨`ThreadPoolTaskExecutor`的配置及其使用,并结合`FutureTask`来讨论异步任务处理。 首先,让我们了解`ThreadPoolTaskExecutor`的基本配置。在Spring中,我们通常通过在配置文件或Java...
Java FutureTask类使用案例解析 Java FutureTask类是一种异步计算的工具,用于执行长时间的任务并获取结果。它实现了Runnable和Future接口,既可以作为一个Runnable对象提交给Executor执行,也可以作为一个Future...
- `FutureTask`内部使用了一个`volatile`变量`state`来管理任务的状态,确保多线程环境下的可见性和有序性。 - 当`FutureTask`被提交给`Executor`时,`Executor`实际上是在另一个线程中调用`run()`方法。 - 如果...
提前完成任务之FutureTask使用.mp4 Future设计模式实现(实现类似于JDK提供的Future).mp4 Future源码解读.mp4 ForkJoin框架详解.mp4 同步容器与并发容器.mp4 并发容器CopyOnWriteArrayList原理与使用.mp4 并发容器...
理解`Future`和`FutureTask`的工作原理,以及如何与`ExecutorService`配合使用,是进行高效并发编程的关键。在实际应用中,它们常用于处理耗时计算、异步数据获取等场景,提高了程序的响应性和并发性。
- 实现Callable接口:与Runnable类似,但Callable可以返回结果并抛出异常,需要配合FutureTask使用。 2. 线程状态:新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)、等待(Waiting)、超时等待...
第42节提前完成任务之FutureTask使用00:11:43分钟 | 第43节Future设计模式实现(实现类似于JDK提供的Future)00:19:20分钟 | 第44节Future源码解读00:29:22分钟 | 第45节Fork/Join框架详解00:28:09分钟 | 第46节...
在实际开发中,ExecutorService(如ThreadPoolExecutor)经常与Future和FutureTask一起使用,因为ExecutorService可以提交Runnable或Callable任务,并返回Future,从而实现对任务的异步处理和结果获取。例如: ```...
第42节提前完成任务之FutureTask使用00:11:43分钟 | 第43节Future设计模式实现(实现类似于JDK提供的Future)00:19:20分钟 | 第44节Future源码解读00:29:22分钟 | 第45节Fork/Join框架详解00:28:09分钟 | 第46节...
第42节提前完成任务之FutureTask使用00:11:43分钟 | 第43节Future设计模式实现(实现类似于JDK提供的Future)00:19:20分钟 | 第44节Future源码解读00:29:22分钟 | 第45节Fork/Join框架详解00:28:09分钟 | 第46节...
第42节提前完成任务之FutureTask使用00:11:43分钟 | 第43节Future设计模式实现(实现类似于JDK提供的Future)00:19:20分钟 | 第44节Future源码解读00:29:22分钟 | 第45节Fork/Join框架详解00:28:09分钟 | 第46节...
Android开发者可以结合Handler或FutureTask使用线程池,以实现更复杂的异步操作。 在实际开发中,选择哪种异步方式取决于任务的性质和项目的具体需求。对于简单的异步操作,如快速的数据加载,AsyncTask可能是最...
- **实现Callable接口**:配合FutureTask使用,Callable可以返回结果,而Runnable不能。 2. **线程的状态**: - 新建(New):线程被创建但尚未启动。 - 可运行(Runnable):线程已启动,等待CPU分配时间片执行...
《揭密FutureTask:Java异步编程的核心工具》 在Java并发编程中,FutureTask扮演着至关重要的角色,它是实现异步计算的关键组件。本文将深入探讨FutureTask的原理和用法,帮助开发者更好地理解和利用这个强大的工具...
本文将详细介绍Future和FutureTask的关系、使用和分析。 一、Future介绍 Future位于java.util.concurrent包下,是一个接口,定义了五个方法: 1. `cancel(boolean mayInterruptIfRunning)`: 取消任务,取消成功则...
当使用 FutureTask.get() 方法时,将返回 Callable 接口的返回对象。 FutureTask 的核心方法是 run() 方法,该方法执行 Callable 接口的任务逻辑,并将结果返回。在 run() 方法中,firstly,它会检查状态是否为 NEW...
2、 线程池使用一个线程,执行这个FutureTask任务,线程执行任务过程比较简单,最终会调用Callable.call()或者是Runnable.run()方法,然后得到一个结果,把结果存储在FutureTask实例的outcome属性中,同时把状态修改...