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;
      }
    }
    }
  }
}
目录
相关文章
|
前端开发 Java 应用服务中间件
ruoyi-vue前后端分离项目实现一体化打包(前后端合并打包)
ruoyi-vue前后端分离项目实现一体化打包(前后端合并打包)
2209 0
|
9月前
|
Linux iOS开发 MacOS
deepseek部署的详细步骤和方法,基于Ollama获取顶级推理能力!
DeepSeek基于Ollama部署教程,助你免费获取顶级推理能力。首先访问ollama.com下载并安装适用于macOS、Linux或Windows的Ollama版本。运行Ollama后,在官网搜索“deepseek”,选择适合你电脑配置的模型大小(如1.5b、7b等)。通过终端命令(如ollama run deepseek-r1:1.5b)启动模型,等待下载完成即可开始使用。退出模型时输入/bye。详细步骤如下图所示,轻松打造你的最强大脑。
14394 86
|
Java
使用 `FutureTask` 实现超时控制
【8月更文挑战第17天】
216 0
java中实现File文件的重命名(renameTo)、将文件移动到其他目录下、文件的复制(copy)、目录和文件的组合(更加灵活方便)
这篇文章介绍了Java中使用`renameTo()`、`Files.copy()`等方法对文件进行重命名、移动和复制的操作,并提供了代码实例和测试效果。
java中实现File文件的重命名(renameTo)、将文件移动到其他目录下、文件的复制(copy)、目录和文件的组合(更加灵活方便)
|
缓存 Java 调度
使用scheduleAtFixedRate进行定时任务调度
使用scheduleAtFixedRate进行定时任务调度
|
数据采集 人工智能 监控
阿里云百炼模型训练实战流程:从入门到实战应用
【7月更文第2天】阿里云百炼是AI大模型开发平台,提供一站式服务,涵盖模型训练到部署。用户从注册登录、创建应用开始,选择模型框架,配置资源。接着,进行数据准备、预处理,上传至阿里云OSS。模型训练涉及设置参数、启动训练及调优。训练后,模型导出并部署为API,集成到应用中。平台提供监控工具确保服务性能。通过百炼,开发者能高效地进行大模型实战,开启AI创新。
4035 2
|
JavaScript 前端开发
若依框架 --- 偶发的el-select无法选择的问题
若依框架 --- 偶发的el-select无法选择的问题
634 0
|
安全 架构师 机器人
aizuda
aizuda
300 0
|
存储 JavaScript 前端开发
EasyExcel 实现导入与导出功能(Springboot+Vue)
EasyExcel 实现导入与导出功能(Springboot+Vue)
2296 1
|
传感器 算法 前端开发
电赛信号类经验总结-从零基础到省一不是梦(超多电赛程序、电路资料分享)
电赛信号类经验总结-从零基础到省一不是梦(超多电赛程序、电路资料分享)
2185 1
电赛信号类经验总结-从零基础到省一不是梦(超多电赛程序、电路资料分享)