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;
      }
    }
    }
  }
}
目录
相关文章
|
5月前
CompletableFuture在超时后,能够停止执行吗?
CompletableFuture在超时后,能够停止执行吗?
65 0
|
5月前
|
NoSQL Java 调度
订单超时取消的11种方法(下)
大家好,我是三友~~ 延迟任务在我们日常生活中比较常见,比如订单支付超时取消订单功能,又比如自动确定收货的功能等等。 所以本篇文章就来从实现到原理来盘点延迟任务的11种实现方式,这些方式并没有绝对的好坏之分,只是适用场景的不大相同。
订单超时取消的11种方法(下)
|
JavaScript Java
接口耗时太久怎么办?适当用点Future做异步~
接口耗时太久怎么办?适当用点Future做异步~
使用ThreadPoolExecutor,当提交线程超过maximumPoolSize 会阻塞主线程吗?
使用ThreadPoolExecutor,当提交线程超过maximumPoolSize 会阻塞主线程吗?
135 0
使用ThreadPoolExecutor,当提交线程超过maximumPoolSize 会阻塞主线程吗?
|
JavaScript Dubbo 小程序
接口经常超时?线程池+ FutureTask来解决!
接口经常超时?线程池+ FutureTask来解决!
|
SQL 分布式计算 Java
spark task过多导致任务运行过慢甚至超时
spark task过多导致任务运行过慢甚至超时
715 0
spark task过多导致任务运行过慢甚至超时
netty系列之:可以自动通知执行结果的Future,有见过吗?
netty系列之:可以自动通知执行结果的Future,有见过吗?
|
XML 关系型数据库 Java
Transactional超时时间控制
Transactional超时时间控制
729 0
|
数据采集 存储 前端开发
还在使用Future轮询获取结果吗?CompletionService快来了解下吧。
多线程获取结果还在使用伪异步的Future轮询获取结果吗?CompletionService快来了解下吧。
627 0
还在使用Future轮询获取结果吗?CompletionService快来了解下吧。

热门文章

最新文章