package com.test.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.CancellationException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import com.test.filter.ThreadPoolFilter;
public class TestServlet extends HttpServlet{
private static Logger logger = Logger.getLogger(ThreadPoolFilter.class.getName());
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
List<FutureTask> taskList = new ArrayList<FutureTask>();
int num=10;
addTask(taskList, num);
List<ResultDemo> list=executeTask(taskList, num);
resp.setContentType("text/html;charset=UTF-8");
PrintWriter out = resp.getWriter();
out.println(list.toString());
out.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
super.doGet(req, resp);
}
//设置任务
public void addTask(List<FutureTask> taskList,int num){
for (int i = 0; i < num; i++) {
String t=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss.sss").format(new Date());
taskList.add(new FutureTask<ResultDemo>(new TestCallable(t+"----"+i)));
}
}
//向队列中添加任务并执行
private List<ResultDemo> executeTask(List<FutureTask> taskList,int num){
final List<ResultDemo> ls=new ArrayList<ResultDemo>();
ExecutorService es = Executors.newFixedThreadPool(taskList.size());
for (FutureTask futureTask : taskList) {
//将任务放入队列中排队
ThreadPoolFilter.setWaitqueue(futureTask);
//建立线程池,取结果
final FutureTask task=futureTask;
es.execute(new Runnable() {
@Override
public void run() {
try {
//最晚5秒后获取结果
ls.add((ResultDemo) task.get(5, TimeUnit.SECONDS));
}catch (CancellationException e) {
logger.info("result:CancellationException");
}catch (InterruptedException e) {
logger.info("result:InterruptedException");
task.cancel(true);
} catch (ExecutionException e) {
logger.info("result:ExecutionException");
task.cancel(true);
} catch (TimeoutException e) {
logger.info("FutureTask TimeoutException");
task.cancel(true);
}
}
});
}
es.shutdown();
int second=10;
while(second>0){
if(es.isTerminated()){
second=0;
}else{
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
second--;
}
}
return ls;
}
class TestCallable implements Callable<ResultDemo> {
private String param;
TestCallable(String param) {
this.param=param;
}
@Override
public ResultDemo call() throws Exception {
try {
ResultDemo demo=new ResultDemo();
demo.setCode("000");
demo.setMessage("result:"+param);
Thread.sleep(4000);
return demo;
} catch (Exception e) {
logger.error("call exception:",e);
}
return null;
}
}
}
BlockingQueue队列自定义超时时间取消线程池任务
需积分: 50 23 浏览量
2019-11-25
14:22:14
上传
评论
收藏 341KB RAR 举报
qweasd_asp
- 粉丝: 1
- 资源: 11
最新资源
- 直接插入排序,冒泡排序,直接选择排序.zip
- 在排序2的基础上,再次对快排进行优化,其次增加快排非递归,归并排序,归并排序非递归版.zip
- 实现了7种排序算法.三种复杂度排序.三种nlogn复杂度排序(堆排序,归并排序,快速排序)一种线性复杂度的排序.zip
- 冒泡排序 直接选择排序 直接插入排序 随机快速排序 归并排序 堆排序.zip
- 课设-内部排序算法比较 包括冒泡排序、直接插入排序、简单选择排序、快速排序、希尔排序、归并排序和堆排序.zip
- Python排序算法.zip
- C语言实现直接插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序、归并排序、计数排序,并带图详解.zip
- 常用工具集参考用于图像等数据处理
- 音乐展示网页、基于Stenography的图像数字水印添加与提取,以及基于颜色矩和Tamura算法的图像相似度评估算法py源码
- 基于EmguCV(OpenCV .net封装),图像数字水印加解密算法的实现,其中包含最低有效位算法,离散傅里叶变换算法+文档书
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈