在多线程的编程中你是否也为不知道其他线程是否已经结束、得不到其他线程的执行结果而苦恼。今天我们来看的FutureTask就解决了这个问题。
FutureTask:一种可以携带结果的Runnable.它的计算是通过Callable的call方法来实现的。
我们来看一下FutureTask的构造.
public class FutureTask<V> implements RunnableFuture<V>
可以看到它实现了RunnableFuture接口.
public interface RunnableFuture<V> extends Runnable, Future<V>
而RunnableFuture又实现了Runnable和Future。
Runnable接口想必大家都非常熟悉了。我们来看下Future接口
public interface Future<V> {
boolean cancel(boolean mayInterruptIfRunning);
boolean isCancelled();
boolean isDone();
V get() throws InterruptedException, ExecutionException;
V get(long timeout, TimeUnit unit)
throws InterruptedException, ExecutionException, TimeoutException;
}
cancel(boolean mayInterruptIfRunning) | 取消任务,如果mayInterruptIfRunning设置为true,标识可以取消正在进行中的任务.返回值分为三种情况:1.任务执行中,当mayInterruptIfRunning为true时,返回true.当mayInterruptIfRunning为false时候返回false.2.任务已经完成.无论mayInterruptIfRunning为true or false 都返回false.3.任务未运行 .无论mayInterruptIfRunning为true or false 都返回true |
isCancelled() | 任务是否被成功取消 |
isDone() | 任务是否已经完成.取消、异常、完成都属于完成。 |
get() | 阻塞只到有结果返回 |
get(long timeout, TimeUnit unit) | 指定时间内如果没有返回结果则返回NULL |
我们再来看下FutureTask的构造器
public FutureTask(Callable<V> callable) 中有一个Callable参数。上面我们说过FutureTask的计算实际是通过Callable的call方法来实现的。
public interface Callable<V> {
/**
* Computes a result, or throws an exception if unable to do so.
*
* @return computed result
* @throws Exception if unable to compute a result
*/
V call() throws Exception;
}
Callable接口中只有一个call方法,而且有返回值,这个返回值就是我们计算所携带的结果。
下面是FutureTask的常见用法:
1.Thread 执行FutureTask
package com.asiainfo.concurrent;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
/**
* 可携带结果的任务.
*
* 实现了Runnable接口
*/
import java.util.concurrent.FutureTask;
/**
* Thread 方式启动FutureTask
* @author fansh
*
*/
public class FutureTaskTest{
static FutureTask<String> future=new FutureTask<String>(new Callable<String>() {
public String call() throws Exception {
return "this is the result!";
};
});
private Thread thread = new Thread(future);
private void start(){
thread.start();
}
public static void main(String[] args) {
FutureTaskTest test =new FutureTaskTest();
test.start();
try {
String result=future.get();
System.out.println(result);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
2. ExecutorService启动FutureTask
package com.asiainfo.concurrent;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;
/**
* ExecutorService 方式启动FutureTask
* @author fansh
*
*/
public class FutureTaskTest1 {
static FutureTask<String> future = new FutureTask<String>(new Callable<String>(){
public String call(){
return "this is the result!";
}
});
public static void main(String[] args) throws InterruptedException, ExecutionException{
ExecutorService service =Executors.newCachedThreadPool();
service.submit(future);
service.shutdown();
String result=future.get();
System.out.println(result);
}
}
3.FutureTask 任务未启动时 取消任务
package com.asiainfo.concurrent;
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
/**
* 1:任务尚未开始
* @author fansh
*
*/
public class FutureTaskCanceledTest {
static FutureTask<String> future=new FutureTask<String>(new Callable<String>() {
public String call() throws Exception {
Thread.sleep(1000);
return "a";
};
});
private Thread thread = new Thread(future);
private void start(){
thread.start();
}
public static void main(String[] args) {
FutureTaskCanceledTest test =new FutureTaskCanceledTest();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//boolean flag =future.cancel(true);
boolean flag =future.cancel(false);
System.out.println("任务是否已经取消:"+flag);
//保证任务取消的时候 线程尚未执行.
test.start();
}
}
4.FutureTask 任务完成后 取消任务
package com.asiainfo.concurrent;
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
/**
* 1:任务已经完成
* @author fansh
*
*/
public class FutureTaskCanceledTest1 {
static FutureTask<String> future=new FutureTask<String>(new Callable<String>() {
public String call() {
return "a";
};
});
private Thread thread = new Thread(future);
private void start(){
thread.start();
}
public static void main(String[] args) {
FutureTaskCanceledTest1 test =new FutureTaskCanceledTest1();
test.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
boolean flag=future.cancel(false);
//boolean flag=future.cancel(true);
System.out.println("任务是否已经取消:"+flag);
}
}
5. 任务进行中 响应取消动作
package com.asiainfo.concurrent;
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
/**
* 1:任务进行中......
* @author fansh
*
*/
public class FutureTaskCanceledTest2 {
static FutureTask<String> future=new FutureTask<String>(new Callable<String>() {
public String call() {
while(!Thread.currentThread().isInterrupted()){
System.out.println("任务进行中............");
}
return "a";
};
});
private Thread thread = new Thread(future);
private void start(){
thread.start();
}
public static void main(String[] args) {
FutureTaskCanceledTest2 test =new FutureTaskCanceledTest2();
test.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
boolean flag=future.cancel(true);
//boolean flag=future.cancel(false);
System.out.println("任务是否已经取消:"+flag);
}
}
分享到:
相关推荐
FutureTask中有一个栈,用于存放等待线程,栈顶指针为FutureTask.waiters引用,当任务执行完毕后,会迭代唤醒整个栈中的线程,这时候,各个线程都将被唤醒,并且可以顺利拿到任务的执行结果(执行结果存于FutureTask...
在Java中,Future和FutureTask都是用于获取线程执行的返回结果,但是它们之间存在一些差异和关联。本文将详细介绍Future和FutureTask的关系、使用和分析。 一、Future介绍 Future位于java.util.concurrent包下,是...
Java中的`Future`和`FutureTask`是并发编程中重要的工具,它们允许程序异步执行任务并获取结果。`Future`接口提供了对异步计算结果的访问和控制,而`FutureTask`是`Future`的一个具体实现,它还同时实现了`Runnable`...
Java中的Runnable、Callable、Future和FutureTask是Java多线程编程中的核心概念,它们各自扮演着不同的角色,共同协作以实现并发任务的管理和执行。 1. **Runnable**: Runnable是最基本的多线程接口,它只有一个`...
Java并发编程中,`FutureTask`是一个非常关键的组件,它结合了`Runnable`和`Future`接口的能力,使得我们可以在异步执行的任务完成后获取其结果。`FutureTask`不仅是一个可取消的任务,还能报告其执行状态。在这个...
例如,在一个科学计算应用中,需要对大量数据进行计算,可以使用FutureTask和ExecutorService来实现多任务计算。 三、FutureTask的实现机制 FutureTask的实现机制是通过传入Runnable或者Callable的任务给...
Java FutureTask类使用案例解析 Java FutureTask类是一种异步计算的工具,用于执行长时间的任务并获取结果。它实现了Runnable和Future接口,既可以作为一个Runnable对象提交给Executor执行,也可以作为一个Future...
`FutureTask`是Java并发编程中的一个重要组件,它位于`java.util.concurrent`包下,是`Executor`框架的一部分。这个类结合了`Runnable`或`Callable`接口的特性,并提供了异步执行的能力,同时允许你在任务完成后获取...
在Java的多线程编程中,Spring框架提供了一种便捷的方式来管理和配置线程池,这就是`ThreadPoolTaskExecutor`。这个类是Spring对Java内置的`java.util.concurrent.ThreadPoolExecutor`的封装,允许开发者在Spring...
`Future`、`FutureTask`、`Callable`和`Runnable`是Java并发编程中的核心接口和类,它们在Android开发中同样有着广泛的应用。下面将详细介绍这些概念以及它们如何协同工作。 1. `Runnable`: 这是Java中最基础的多...
JAVA线程总结,包含线程池,显示使用线程实现异步编程,基于JDK中的Future实现异步编程,JDK中的FutureTask等
`FutureTask`是Java并发库中的一个关键组件,它实现了`RunnableFuture`接口,能够作为`Runnable`接口的实现被线程执行,同时也继承了`Future`接口,用于获取计算的结果。`FutureTask`的设计使得我们可以更加灵活地...
FutureTask 是 Java 中的一种非常重要的多线程设计模式,用于异步计算线程之间的结果传递。在 JDK 中,FutureTask 类是 Future 模式的实现,它实现了 Runnable 接口,作为单独的线程运行。在其 run() 方法中,通过 ...
在Java编程语言中,Callable接口是用于创建能够返回结果并可能抛出异常的线程的。与Runnable接口相比,Callable接口提供了更强大的功能,因为Runnable只能定义无返回值的任务,而Callable可以定义有返回值的任务。这...
在Java编程中,多线程是并发执行任务的重要方式,然而在实际应用中,我们可能会遇到某些线程执行时间过长或死锁的情况,这可能导致系统资源的浪费甚至整体性能下降。因此,对线程进行超时监控是必要的,以确保程序的...
在Java并发编程中,FutureTask扮演着至关重要的角色,它是实现异步计算的关键组件。本文将深入探讨FutureTask的原理和用法,帮助开发者更好地理解和利用这个强大的工具。 一、Future接口与FutureTask概述 Future...
《Java Util Concurrent中文版》是Java并发编程领域的重要参考资料,主要涵盖了Java标准库中的`java.util.concurrent`包及其相关类和接口。这个包是Java多线程编程的核心,提供了高效、安全的并发工具,帮助开发者...
此外,Java中的线程创建方式还包括使用Runnable接口、Thread类、Executor框架等。不同的线程创建方式都有其优缺,需要根据实际情况选择合适的线程创建方式。 本文主要介绍了Java使用Callable和Future创建线程操作的...
Java 中实现线程的三种方式及对比 Java 中创建线程主要有三种方式:继承 Thread 类创建线程类、通过 Runnable 接口创建线程类、通过 Callable 和 Future 创建线程。 继承 Thread 类创建线程类 继承 Thread 类创建...
Executor框架中的FutureTask类结合了Future和Runnable,可以在任务完成后获取结果。 总的来说,这份“java并发编程内部分享PPT”涵盖了Java并发编程的多个重要方面,包括线程创建与管理、同步机制、并发容器、...