1、使用线程包

java.util.concurrent.Future

2、Future代表一个异步计算的结果。

它提供了方法来检查是否计算已经完成,还是正在计算而处于等待状态,并且也提供了获取计算结果 方法。当计算完成后,只能通过get方法来获取执行结果,必要的话该方法会阻塞。通过cancel方法可以取消计算。一旦计算已经完成,便无法取消。

主要方法:

cancel():取消任务

get():等待任务执行完成,并获取执行结果

get(long timeout, TimeUnit unit):在指定的时间内会等待任务执行,超时则抛异常。

3、示例代码

 package Concurrent;

 import java.util.concurrent.*;

 /**
* 测试方法的超时时间
*/
public class FutureTest { public static void functionTimeoutTest2() throws Exception{
ExecutorService executorService= Executors.newSingleThreadExecutor();
Future<String> future=executorService.submit(()->
{
Thread.sleep();
return "success";
}
); try{
String result=future.get(,TimeUnit.SECONDS);
//String result=future.get(50,TimeUnit.SECONDS);
System.out.println("result:"+result);
}
catch (TimeoutException e){
System.out.println("超时了!");
}
}
}

如果是java8以前的,可以使用下面这段代码:

 package Concurrent;

 import java.util.concurrent.*;

 /**
* 测试方法的超时时间
*/
public class FutureTest { public static void functionTimeoutTest() throws Exception{
//java8建议使用lambda表达式来替代匿名内部类
Callable<String> task=new Callable<String>() {
@Override
public String call() throws Exception {
Thread.sleep();
return "success";
}
}; ExecutorService executorService= Executors.newSingleThreadExecutor();
Future<String> future=executorService.submit(task);
try{
String result=future.get(,TimeUnit.SECONDS);
//String result=future.get(50,TimeUnit.SECONDS);
System.out.println("result:"+result);
}
catch (TimeoutException e){
System.out.println("超时了!");
}
}
}

4、Callable

Callable相当于Runnable,所以,这里实现的是一个线程,但是与Runnable不同的是,它是具有返回值的,这个返回值就是我们想要任务返回的结果,比如说,我们想要任务返回的是一个提示信息,那么,返回值可以是String,然后在我们要实现的call()方法中return一句提示信息,接着只要使用Future类的get()方法,就可以从里面得到提示信息了,只要任务完成。所以,由此我们可以知道,java SE5比起以前来,在并发这方面做了更多的工作,它完善了我们的并发线程机制,使我们可以更好的根据任务的完成情况来进行与其他任务的协作,比如说,我们可以通过Future的返回值来决定是否终止任务,或者开启另一个任务。任务的终止可以使用Future的方法future.cancel(boolean),其中boolean为true或false,来决定是否终止,至于开启另一个任务,可以重新开启另一个线程,但是这里就马上有个问题浮现出来,就是当Futrue的结果返回来时,该任务有没有结束呢?因为这时一定已经执行完该任务的call()方法。是的,该任务已经结束了,只是我们没有取出它的返回结果而已。

5、更进一步:使用FutureTask

FutureTask既实现Runnable又实现Callable,现在我们可以这样做:

 public static  void functionTimeoutTest3() throws  Exception{
ExecutorService executorService= Executors.newSingleThreadExecutor();
FutureTask<String> future=new FutureTask<>(()->
{
Thread.sleep(10000);
return "success";
}
);
executorService.execute(future); try{
String result=future.get(5,TimeUnit.SECONDS);
//String result=future.get(50,TimeUnit.SECONDS);
System.out.println("result:"+result);
}
catch (TimeoutException e){
System.out.println("超时了!");
}
}

这里就是FutureTask的一般用法,它最大的好处就是我们可以将任务交给执行器后执行其他操作,然后再从里面得到任务的结果。这里必须要注意,只有FutureTask这种既实现Runnable又实现Callable才能够通过executor()递交给ExecutorService,而Future不行,只能通过submit(),因为executor()要求的参数是一个实现了Runnable的类。

Java使用Future设置方法超时的更多相关文章

  1. Java heap space设置方法记录

    最近被 OutOfMemory Error折腾得够呛,记载一点设置JVM虚拟机内存Javaheap space的方法. Tomcat 7 参考:  http://www.davidghedini.co ...

  2. java的Future使用方法

    首先,Future是一个接口,该接口用来返回异步的结果. package com.itbuluoge.mythread; import java.util.ArrayList; import java ...

  3. java环境变量设置方法

    1.安装JDK,安装过程中可以自定义安装目录等信息,例如我们选择安装目录为D:\java\jdk1.5.0_08:    2.安装完成后,右击“我的电脑”,点击“属性”:         3.选择“高 ...

  4. 转!!Java设置session超时(失效)的时间

    Java设置session超时(失效)的时间   在一般系统登录后,都会设置一个当前session失效的时间,以确保在用户长时间不与服务器交互,自动退出登录,销毁session具体设置的方法有三种:1 ...

  5. session超时时间设置方法

    session超时时间设置方法 由于session值之前没有设置,以至于刚登录的网站,不到一分钟就超时了,总结了一下,原来是session过期的原因,以下是设置session时间的3个方法: 1. 在 ...

  6. Socket编程实践(9) --套接字IO超时设置方法

    引:超时设置3种方案 1. alarm超时设置方法 //代码实现: 这种方式较少用 void sigHandlerForSigAlrm(int signo) { return ; } signal(S ...

  7. 接口调试工具ApiPost的发送超时时间设置方法

    有部分使用ApiPost的同学反应:发送接口调试时,响应超时时间设置的太短导致接口访问失败,怎么设置呢? 就连百度也有很多人在搜: 今天就来说一说. ApiPost简介: ApiPost是一个支持团队 ...

  8. 解决ssh连接超时时间(ssh timeout)的设置方法

    本文介绍下,linux中ssh连接超时时间的设置方法,以避免总是被强行退出.有需要的朋友,参考下吧.有关修改ssh连接超时时间的方法,网上介绍的很多了.比如下面这个:可以减少ssh连接超时等待的时间: ...

  9. java发送邮件基础方法(另附部分主流邮箱服务器地址、端口及设置方法)

    java发送邮件基础方法,可通过重载简化参数 import java.io.File; import java.io.UnsupportedEncodingException; import java ...

随机推荐

  1. 全方位理解Android权限之底层实现概览

    0000 这个阶段搞了很多和Android文件权限相关的问题,虽然一知半解,但也算是对Android权限机制有一些自己的理解.遂将这些内容整理出来.因为权限这部分涉及到的内容很多,故将知识分为几块内容 ...

  2. js的深层克隆和浅层克隆代码和理解

    <script> //判断是不是原始值 //判断是数组还是对象 //建立相应的数组或对象 var obj={ name:'辣鸡', sex:'male', card:['laobi','f ...

  3. vue缓存页面

    vue如何和ionic的缓存机制一样,可以缓存页面,在A页面跳转至B页面后返回A页面时A页面的数据还在? 在app.vue中将router-view使用keep-alive包起来,使用v-if来判断使 ...

  4. c++趣味之返回void

    void a(){} void b(){return a();} int main() { b(); ; } 这个是能编译的(vs,gcc),void函数是能返回,一般不会这么写,但是这样确实可以.你 ...

  5. Kotlin 或将取代 Java——《Java 编程思想》作者 Bruce Eckel [转]

    Bruce Eckel 是<Java 编程思想>.<C++编程思想>的作者,同时也是 MindView 公司的总裁,该公司向客户提供软件咨询和培训.他是 C++ 标准委员会拥有 ...

  6. VMware虚拟机CentOS7网络通信与无线上网

    实现主机和虚拟机网络通信 1.虚拟机设置 VMware界面最上面,选择[虚拟机]->[设置]:将网络连接改为"桥接模式",如下图所示: 2.CentOS7网络设置 自动获取I ...

  7. python使用sax实现xml解析

    之前在使用xml解析的时候,在网上搜了很多教程,最终没有能按照网上的教程实现需求. 所以呢,只好自己去看源码,在sax的__init__.py下看到这么一段代码: 1 def parse(source ...

  8. php判断手机是安卓系统还是ios系统

    最近项目,要判断用户的手机是安卓的还是ios的,搜了一下相关的资料,最终获得的结果.事实证明,是有效的!主要是要用到HTTP_USER_AGENT,它表示的意思是用来检查浏览页面的访问者在用什么操作系 ...

  9. leetcode刷题--两数之和(简单)

    一.序言 第一次刷leetcode的题,之前从来没有刷题然后去面试的概念,直到临近秋招,或许是秋招结束的时候才有这个意识,原来面试是需要刷题的,面试问的问题都是千篇一律的,只要刷够了题就差不多了,当然 ...

  10. 我的BRF+自学教程(二):跟踪模式(trace mode)

    使用自开发程序来处理业务逻辑时,处理过程通常是个黑箱,业务顾问和业务用户不知道程序的具体运行方式,要依赖文档和频繁的沟通来确认实际情况. BRFplus可以通过配置的方式实现业务逻辑,使得业务人员把业 ...