有时候在实际应用中,某些操作很耗时,但又不是不可或缺的步骤。比如用网页浏览器浏览新闻时,最重要的是要显示文字内容,至于与新闻相匹配的图片就没有那么重要的,所以此时首先保证文字信息先显示,而图片信息会后显示,但又不能不显示,由于下载图片是一个耗时的操作,所以必须一开始就得下载。Java的并发库的Future类就可以满足这个要求。
Future模式可以这样来描述:我有一个任务,提交给了Future,Future替我完成这个任务。期间我自己可以去做任何想做的事情。一段时间之后,我就便可以从Future那儿取出结果。就相当于下了一张订货单,一段时间后可以拿着提订单来提货,这期间可以干别的任何事情。其中Future 接口就是订货单,真正处理订单的是Executor类,它根据Future接口的要求来生产产品。
Future接口提供方法来检测任务是否被执行完,等待任务执行完获得结果,也可以设置任务执行的超时时间。这个设置超时的方法就是实现Java程序执行超时的关键。
Future接口是一个泛型接口,严格的格式应该是Future<V>,其中V代表了Future执行的任务返回值的类型。 Future接口的方法介绍如下:
*boolean cancel (boolean mayInterruptIfRunning) 取消任务的执行。参数指定是否立即中断任务执行,或者等等任务结束
*boolean isCancelled () 任务是否已经取消,任务正常完成前将其取消,则返回 true
*boolean isDone () 任务是否已经完成。需要注意的是如果任务正常终止、异常或取消,都将返回true
*V get () throws InterruptedException, ExecutionException 等待任务执行结束,然后获得V类型的结果。InterruptedException 线程被中断异常, ExecutionException任务执行异常,如果任务被取消,还会抛出CancellationException
*V get (long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException 同上面的get功能一样,多了设置超时时间。参数timeout指定超时时间,uint指定时间的单位,在枚举类TimeUnit中有相关的定义。如果计算超时,将抛出TimeoutException
package 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.Future;
public class TestFutureTask {
public static void main(String[] args)throws InterruptedException,
ExecutionException {
final ExecutorService exec = Executors.newFixedThreadPool(5);
Callable<String> call = new Callable<String>() {
public String call() throws Exception {
Thread.sleep(1000 * 3);
return "Other less important but longtime things.";
}
};
Future<String> task = exec.submit(call);
//重要的事情
Thread.sleep(1000 * 3);
System.out.println("Let's do important things.");
//不重要的事情
String obj = task.get();
System.out.println(obj);
//关闭线程池
exec.shutdown();
}
}
分享到:
相关推荐
jdk-8u202-linux-arm64-vfp-hflt.tar.gz适用于Linux ARM v6/v7 Soft Float ABI 64位系统,是在Binary Code License (“BCL”)许可协议下提供最后的免费商业版本,允许用在生产环境中; 对于 2019 年 4 月 16 日开始...
jdk 17需要 新增 配置 如下 jvm参数 --add-opens=java.base/jdk.internal.org.objectweb.asm=ALL-UNNAMED --add-opens=java.base/jdk.internal.org.objectweb.asm.tree=ALL-UNNAMED
JDK1.5中的线程池(java.util.concurrent.ThreadPoolExecutor)使用
合适研究底层研发员,但,一般程序员也必须掌握的要点 JDK研究系列--》util.concurrent(java.util part3)
jdk-8u241-linux-arm64-vfp-hflt.tar.gz 64位的ArmLinux系统java jdk
64位的jdk安装文件,Java-version-1.8.0_45版本,可以直接下载。
javaJDK1.5---32位和64位,可以下载安装使用 javaJDK1.5---32位和64位,可以下载安装使用
backport-util-concurrent(2.2 /3.1) 资源共享,有需要其他jar包的可以在评论留言,看到后我会陆续上传。
Centos7离线安装文件 jdk-8u231-linux-x64.tar.gz压缩包 免费下载,现在博客都是付费文件,搞得头大,现在免费分享
java-jdk1.8-8u361-all-jdk-win-linux 该压缩包中包含jdk1.8-8u361下windows版本和linux版本,其包含快速安装包和对应的jdk压缩包版本,具体内容如下: jdk-8u361-linux-aarch64.rpm jdk-8u361-linux-i586.rpm jdk-8...
1.下载后重命名:jdk-8u281-linux-x64.tar.gz 2.解压 tar -zxvf jdk-8u281-linux-x64.tar.gz 3.配置环境变量:vim /etc/profile 最后添加: export JAVA_HOME=/opt/jdk export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$...
JDK1.5新特性泛型_深入研究JDK1.5新特性泛型_深入研究JDK1.5新特性泛型_深入研究
jdk-8u151-linux-arm64-vfp-hflt.tar.gz.................................................................................................
jdk-8u202-linux-arm64-vfp-hflt.tar.gz,Oracle-jdk8,JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和...
JDK1.5中的线程池(java.util.concurrent.ThreadPoolExecutor)使用简介
jdk 这个安装文件不能用 就是为了资源分
jdk-8u231-linux-x64.tar.gz JDK for linux x64 tar.gz 大小:185.16 MB sha256: a011584a2c9378bf70c6903ef5fbf101b30b08937441dc2ec67932fb3620b2cf md5: c1fef2e714be761773ee0fc2be5dd78e
arm架构的1.7jdk,在树莓派4B上可以应用<jdk-7u51-linux-arm-vfp-hflt.gz>
Linux下arm_64平台jdk安装包,oracle版本的源码包,包含jre。有需要的小伙伴下载吧。