Java限制代码执行超时时间

Java设置限制代码执行超时时间

最近需求是这样

爬虫爬取了1000条数据,需要对这1000条数据进行数据清洗,也就是把里边的富文本的图片与视频等资源,上传到OSS,然后再把富文本里的原资源地址改成OSS的地址。

在遍历的过程中,总会有一两条数据清洗时占用大量的时间,因为单条数据不是很重要,占用了大量时间,不值得,所以需要定一个超时处理,在数据清洗超出指定时间,就跳过处理。

jdk1.5自带的并发库中Future类

jdk1.5自带的并发库中Future类就能满足这个需求。Future类中重要方法包括get()和cancel()。get()获取数据对象,如果数据没有加载,就会阻塞直到取到数据,而 cancel()是取消数据加载。另外一个get(timeout)操作,表示如果在timeout时间内没有取到就失败返回,而不再阻塞。

代码如下:

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import com.sun.corba.se.impl.orbutil.closure.Future;
import com.sun.corba.se.impl.orbutil.threadpool.TimeoutException;


for (int i = 0; i < 1000; i++) {
  // 开辟线程池
  final ExecutorService exec = Executors.newFixedThreadPool(1);

  Callable<String> call = new Callable<String>() {
      public String call() throws Exception {
          // TODO 执行你的代码
          return "线程执行完成.";
      }
  };

  // 任务处理超时时间设为 60 秒
  try {
      Future<String> future = exec.submit(call);

      String obj = future.get(60, TimeUnit.SECONDS);
      System.out.println("任务成功返回:" + obj);
  } catch (TimeoutException ex) {
      System.out.println("处理超时啦....");
      ex.printStackTrace();
  } catch (Exception e) {
      System.out.println("处理失败.");
      e.printStackTrace();
  }
  // 关闭线程池
  exec.shutdown();
}
Java限制代码执行超时时间

完成!

参考了:https://blog.csdn.net/simplty/article/details/52439822

类似文章

一条评论

回复 虹口第一胖 取消回复

您的电子邮箱地址不会被公开。 必填项已用*标注