FutureTask是一种可以取消的异步的计算任务。它的计算是通过Callable实现的,它等价于可以携带结果的Runnable,并且有三个状态:等待、运行和完成。完成包括所有计算以任意的方式结束,包括正常结束、取消和异常。
Future有个get方法而获取结果只有在计算完成时获取,否则会一直阻塞直到任务转入完成状态,然后会返回结果或者抛出异常。
Executor框架利用FutureTask来完成异步任务,并
可以用来进行任何潜在的耗时的计算。一般FutureTask多用于耗时的计算,主线程可以在完成自己的任务后,再去获取结果。
FutureTask有下面几个重要的方法:
1.get()
阻塞一直等待执行完成拿到结果
2.get(int timeout, TimeUnit timeUnit)
阻塞一直等待执行完成拿到结果,如果在超时时间内,没有拿到抛出异常
3.isCancelled()
是否被取消
4.isDone()
是否已经完成
5.cancel(boolean mayInterruptIfRunning)
试图取消正在执行的任务
package futuretask;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
/**
*
*<p>Test</p>
*<p>Description:</P>
*<p>Company:</p>
*<p>Department:CAS</p>
*@Author: Tommy Zhou
*@Since: 1.0
*@Version:Date:2011-4-26
*
**/
public class FutureTaskSample {
static FutureTask<String> future = new FutureTask(new Callable<String>(){
public String call(){
return getPageContent();
}
});
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";
}
public static String getPageContent(){
return "testPageContent and provide that the operation is a time exhausted thing...";
}
}
分享到:
相关推荐
- `FutureTask(Runnable runnable, V result)`:用给定的`Runnable`实例和预期结果创建一个新的`FutureTask`。这个版本通常用于那些不返回结果的任务。 2. **主要方法**: - `void run()`:执行任务。当`Executor...
Java使用Callable和Future创建线程操作示例主要介绍了Java使用Callable和Future创建线程操作,结合实例形式分析了java使用Callable接口和Future类创建线程的相关操作技巧与注意事项。 首先,Java 5开始,Java提供了...
例如,对于`ExecutorService es`,执行`submit()`方法时,内部会将`Runnable`或`Callable`包装成`RunnableFuture`实例,如`FutureTask`。`ExecutorService`执行这个`RunnableFuture`,任务完成后,结果可通过`Future...
当你有一个Callable任务并希望将其作为线程执行时,可以创建一个FutureTask实例,然后将这个实例传递给Executor。 下面简要说明它们之间的关系和用法: - Runnable通常用于简单的任务,不关心结果的返回。 - ...
2、 线程池使用一个线程,执行这个FutureTask任务,线程执行任务过程比较简单,最终会调用Callable.call()或者是Runnable.run()方法,然后得到一个结果,把结果存储在FutureTask实例的outcome属性中,同时把状态修改...
在这个简谈中,我们将深入探讨`FutureTask`的实现原理和使用方式。 首先,`FutureTask`实现了`Runnable`接口,这意味着它可以直接被`Executor`服务执行。同时,它也实现了`Future`接口,提供了检查任务是否完成、...
Java提供了wait()、notify()和notifyAll()方法进行线程间的通信,但这需要在同步控制块(synchronized)中使用。Java 5引入了BlockingQueue阻塞队列,提供了一种更安全的线程间通信方式,如ArrayBlockingQueue、...
2. 创建FutureTask实例:FutureTask是Java并发包(java.util.concurrent)中的一个类,它是一个可以被取消的任务,同时也是一个实现了Runnable接口的Future。FutureTask提供了对Callable结果的访问和管理,包括获取...
3. 使用Callable和Future:适合需要返回结果的线程,创建Callable对象,通过FutureTask包装,再创建Thread。 以下是一个简单的Runnable接口示例: ```java class MyRunnable implements Runnable { public void ...
这正是"tiny-asyncload"框架的核心思想:通过动态代理和FutureTask,实现了一个轻量级的、易于理解和使用的异步加载解决方案。 在实际使用tiny-asyncload时,开发者可以通过提供自定义的InvocationHandler实现特定...
下面是一个使用`Callable`和`FutureTask`的简单示例: ```java import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import ...
在编程领域,多线程是一种重要的并发执行机制,它允许程序同时执行多个任务,...通过分析这些代码,开发者可以深入理解多线程的使用和实践,提高编程技能。务必仔细阅读并动手实践,以便更好地理解和掌握多线程编程。
首先,我们创建一个ExecutorService实例,然后通过`submit()`方法提交Callable任务。`submit()`方法会返回一个`Future`对象,`Future`表示异步计算的结果。我们可以使用`Future`来检查任务是否完成,获取结果或取消...
本篇将深入探讨标题"8种常用创建线程的方法thread.zip"中提到的八种主要的Java线程创建方法,帮助开发者更好地理解和掌握这一核心概念。 1. 继承Thread类 Java中的`Thread`类是所有线程的基类,我们可以通过创建`...
`API.docx`可能详细列出了相关类和方法的使用。`多线程.docx`可能是关于Java多线程的深入讲解,涵盖线程安全、线程同步、锁的使用等方面。 总之,理解并熟练掌握Java多线程和锁机制对于编写高效、健壮的并发代码至...
首先,创建一个实现`Callable`接口的类,然后使用`FutureTask`包装`Callable`对象,因为`FutureTask`同时实现了`Runnable`和`Future`接口。这样,`FutureTask`可以被传递给`Thread`构造器并启动线程。`Future`接口...
`Future`常与`ExecutorService`的`submit()`方法一起使用,返回一个`Future`实例,可以通过该实例监控任务状态。 `CompletionService`接口扩展了`ExecutorService`,它提供了获取已完成任务的便捷方式,特别适用于...
例如,`TestCyclicBarrier`和`TestCyclicBarrier2`可能包含了如何创建和使用`CyclicBarrier`来同步多个任务的实例。 2. **BlockingQueue**:阻塞队列是一种线程安全的数据结构,它支持插入和移除操作,并且在队列满...
- 实现`Callable`接口:适用于需要有返回结果的线程,可以抛出检查异常,通过`FutureTask`包装`Callable`并使用`ExecutorService`执行。 2. **线程的状态与生命周期** - 新建(New):线程被创建但未启动。 - 可...
然后,创建 Callable 实现类的实例,使用 FutureTask 类来包装 Callable 对象,该 Future Task 对象封装了 Callable 对象的 call() 方法的返回值。最后,使用 Future Task 对象作为 Thread 对象的 target 创建线程...