future给任务设置时限

简介: future给任务设置时限

如果一个活动无法再某个确定的时间内完成,那么它的结果就失效了,此时程序可以放弃该活动。


使用future.get(timeout, unit):在结果准备好后立即返回,如果在时限内没有准备好,就会抛出TimeoutException。


    如果任务超时后,future.cancel(true)取消任务。


小案例:在预期时间加载广告页面

package com.thread;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
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;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
/**
 * 为任务设置时限
 * 
 * 为任务设置预期完成时间,如果get超时,取消任务,并使用模式的信息取代它
 * 
 * f.get(timeout, unit)
 * future.get("预期时间值","预期时间单位"),如果超过指定的预期返回时间还不能返回结果,那么就会抛出TimeoutException的异常
 * 
 * f.get()如果不带参数,那么会堵塞直到返回结果
 * @author hadoop
 *
 */
public class TimeoutThread {
     //固定大小的线程池,同时只能接受5个任务
  static  ExecutorService mExecutor = Executors.newFixedThreadPool(5);
  final static long timeout = 4 ;
     /**
      * 模拟在预定时间内获取广告信息
      * @throws InterruptedException
      */
  static void rederPageWithAd(final String pageTitle)  throws  InterruptedException{
    Future<String> f = mExecutor.submit(new Callable<String>() {
    @Override
    public String call() throws Exception {
      System.out.println("开始加载广告信息");
      int randomTime = new Random().nextInt(5) + 1;//限制耗时不会出现0s,不会大于10s
      Thread.sleep(randomTime * 1000);
      System.out.println("正常加载广告耗时:" + randomTime +"s");
      return pageTitle;
    }
    });
    String page;
    try {
    //在预计时间内等待
    System.out.println("预期任务执行完时间:" + timeout + "s");
    //page = f.get();
    page = f.get(timeout, TimeUnit.SECONDS);
    } catch (ExecutionException e) {
    page = "出现执行异常,显示默认的广告页面";
    } catch (TimeoutException e) {
    page = "任务执行超时,显示默认的广告页面";
    f.cancel(true);//取消没有执行完的任务,设置为ture说明任务能被中断,否则执行中的任务要完成
    }
    System.out.println("成功加载广告页面:" + page);
  }
  public static void main(String[] args) {
    try {
    List<String> titleList = new ArrayList<String>();
    titleList.add("体育赛事");
    titleList.add("娱乐新闻");
    titleList.add("实时聚焦");
    titleList.add("国际咨询");
    titleList.add("影视天下");
    titleList.add("游戏风云");
    for (String string : titleList) {
      rederPageWithAd(string);
    }
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } finally{
              /**
        * 只有执行了shutdown方法,执行isTerminated才有效。否则isTerminated一直为ture
        */
       mExecutor.shutdown();
       while(true){
      if(mExecutor.isTerminated()){
      System.out.println("所有任务都执行完了,关闭线程池");
      break;
      }
    }
    }
  }
}
目录
相关文章
|
11月前
|
弹性计算 搜索推荐 异构计算
阿里云服务器多少钱一年?整理2025年最新爆款服务器排行榜
阿里云2025年优惠持续,轻量服务器200M带宽38元/年起,ECS 2核2G 99元/年,2核4G 199元/年,4核16G 89元/月,8核32G 160元/月,香港轻量25元/月起,新老用户同享,续费不涨价。
1667 6
|
Docker 容器
Docker部署minio-arm64版本,阿里官方推荐
Docker部署minio-arm64版本,阿里官方推荐
|
设计模式 Java Go
【再谈设计模式】状态模式~对象行为的状态驱动者
状态模式属于行为型设计模式。它将对象的行为封装在不同的状态类中,使得对象在不同的状态下表现出不同的行为。上下文(Context):这是一个包含状态对象的类,它定义了客户感兴趣的接口,并维护一个具体状态对象的引用。上下文将操作委托给当前的状态对象来处理。抽象状态(State):这是一个抽象类或者接口,它定义了一个特定状态下的行为接口。所有具体的状态类都实现这个接口。具体状态(Concrete State):这些是实现抽象状态接口的类,每个具体状态类实现了与该状态相关的行为。
829 18
|
自然语言处理 开发者
flutter:Getx (十四)
Getx 是一个轻量级的 Flutter 库,用于状态管理和路由导航。使用 Getx 需要包裹在 `GetMaterialApp` 中。首先添加依赖 `get: ^4.6.5`,然后引入 `import &#39;package:get/get.dart&#39;;`。Getx 提供了 `defaultDialog`、`snackbar`、`bottomSheet` 和导航功能,支持参数传递和响应式编程(如 `Obx`)。此外,还支持国际化配置,通过 `Messages` 类定义多语言文本,并通过 `MessagesController` 控制器切换语言。
457 0
Nyx
|
人工智能 自然语言处理 Serverless
体验《触手可及,函数计算玩转 AI 大模型》测评报告
该解决方案利用阿里云函数计算服务高效部署和运行AI大模型,涵盖文本、图像、语音生成等应用。特点包括高效部署、极致弹性、按量付费及拥抱开源。用户可选择预设模板或直接部署模型镜像,快速启动AI项目。适用于内容创作、自动化客服、智能分析等场景,提供快速迭代和扩展能力。尽管已提供部署时长和费用预估,但对非技术用户还需更多指导。实际案例展示了其优势,但仍需补充技术细节和故障排除指南。
Nyx
283 1
|
存储 编解码 Python
Python GDAL基于经、纬度提取大量遥感影像中相同位置处像元的数值
【2月更文挑战第8天】本文介绍基于Python语言中的gdal模块,对2景不同的遥感影像加以对应位置像素值匹配的方法——即基于一景遥感影像的每一个像元,提取另一景遥感影像中,与之空间位置相同的像元的像素值的方法~
691 1
Python GDAL基于经、纬度提取大量遥感影像中相同位置处像元的数值
|
JSON 程序员 定位技术
使用echarts+echarts-gl绘制3d地图,实现地图轮播效果
记录一下大屏开发中使用到的echarts-gl 大屏的页面根据需求前前后后改了几个版本了,地图的样式也改了又改 这里记录一下,因为echarts属性用到的比较多也比较杂,防止以后需要用到忘记了
|
消息中间件 负载均衡 Java
RocketMQ结合实际场景顺序消费,它是如何保证顺序消费的?
RocketMQ结合实际场景顺序消费,它是如何保证顺序消费的?
RocketMQ结合实际场景顺序消费,它是如何保证顺序消费的?

热门文章

最新文章