分类目录: java
Java限制代码执行超时时间
Post date:
Author: cyy
标签: java
Number of comments: 1 comment
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();
}
完成!
虹口第一胖
says:不务正业的前端