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;
      }
    }
    }
  }
}
目录
相关文章
|
13天前
|
监控 中间件 PHP
hyperf-alarm-clock,一个自动计算代码执行时间,超时并发送通知的小工具
`hyperf-alarm-clock` 是专为 Hyperf 框架设计的库,用于监控代码执行时间并在超时后发送通知。支持多种通知通道,如标准输出、日志文件和飞书。适用于需要确保响应及时性的系统,如电商平台订单处理流程监控。安装简单,配置灵活,是提高系统性能和稳定性的有力工具。
19 1
hyperf-alarm-clock,一个自动计算代码执行时间,超时并发送通知的小工具
|
7月前
|
消息中间件 NoSQL Kafka
订单超时取消的11种方式(非常详细清楚)
订单超时取消的11种方式(非常详细清楚)
3061 2
订单超时取消的11种方式(非常详细清楚)
|
6月前
|
Java
java线程池执行任务(一次任务、固定间隔时间任务等)
java线程池执行任务(一次任务、固定间隔时间任务等)
312 1
CompletableFuture在超时后,能够停止执行吗?
CompletableFuture在超时后,能够停止执行吗?
167 0
|
消息中间件 NoSQL Java
订单超时取消的11种方法(上)
大家好,我是三友~~ 延迟任务在我们日常生活中比较常见,比如订单支付超时取消订单功能,又比如自动确定收货的功能等等。 所以本篇文章就来从实现到原理来盘点延迟任务的11种实现方式,这些方式并没有绝对的好坏之分,只是适用场景
订单超时取消的11种方法(上)
|
NoSQL Java 调度
订单超时取消的11种方法(下)
大家好,我是三友~~ 延迟任务在我们日常生活中比较常见,比如订单支付超时取消订单功能,又比如自动确定收货的功能等等。 所以本篇文章就来从实现到原理来盘点延迟任务的11种实现方式,这些方式并没有绝对的好坏之分,只是适用场景的不大相同。
订单超时取消的11种方法(下)
|
JavaScript Java
接口耗时太久怎么办?适当用点Future做异步~
接口耗时太久怎么办?适当用点Future做异步~
116 0
使用ThreadPoolExecutor,当提交线程超过maximumPoolSize 会阻塞主线程吗?
使用ThreadPoolExecutor,当提交线程超过maximumPoolSize 会阻塞主线程吗?
177 0
使用ThreadPoolExecutor,当提交线程超过maximumPoolSize 会阻塞主线程吗?
线程的取消
线程的取消
114 0
|
Java 编译器
线程池:3大方法,7大参数,4中拒绝策略
线程池:3大方法,7大参数,4中拒绝策略
线程池:3大方法,7大参数,4中拒绝策略