ScheduledExecutorService调度线程池运行几次后停止某一个线程
开发中偶尔会碰到一些轮询需求,比如我碰到的和银行对接,在做完某一个业务后银行没有同步给到结果,这时候就需要查询返回结果,我们的需求是5分钟一次,查询3次,3次过后如果没有结果则T+1等银行的文件,对于这种任务我们的要求是轮询不是很严格,所以我采取调度线程池方式,如果有查询任务,加入线程池,设置好执行次数及执行时间间隔,具体代码如下:
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import java.util.concurrent.*; public class LocalTest { private static final Logger log = LoggerFactory.getLogger(LocalTest.class); @Test
public void test01() throws InterruptedException {
ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);
ConcurrentHashMap<String, Future> futureMap = new ConcurrentHashMap<>(); JobTest jobTest1 = new JobTest("job1",futureMap);
Future future1 = executorService.scheduleAtFixedRate(jobTest1,1, 5, TimeUnit.SECONDS);
futureMap.put(jobTest1.getJobId(),future1); JobTest jobTest2 = new JobTest("job2",futureMap);
Future future2 = executorService.scheduleAtFixedRate(jobTest2,1, 5, TimeUnit.SECONDS);
futureMap.put(jobTest2.getJobId(),future2); Thread.sleep(1000L * 30); JobTest jobTest3 = new JobTest("job3",futureMap);
Future future3 = executorService.scheduleAtFixedRate(jobTest3,1, 5, TimeUnit.SECONDS);
futureMap.put(jobTest1.getJobId(),future3); JobTest jobTest4 = new JobTest("job4",futureMap);
Future future4 = executorService.scheduleAtFixedRate(jobTest4,1, 5, TimeUnit.SECONDS);
futureMap.put(jobTest4.getJobId(),future4); Thread.sleep(1000L * 300);
executorService.shutdown();
} @Test
public void test02() { } class JobTest implements Runnable { private ConcurrentHashMap<String, Future> futureMap;
private int count = 0;
private String jobId; public JobTest(){ } public JobTest(String jobId, ConcurrentHashMap<String, Future> futureMap) {
super();
this.jobId = jobId;
this.futureMap = futureMap;
} @Override
public void run() {
count++;
log.info("{} count is {}", jobId, count);
if (count > 2) {
Future future = futureMap.remove(jobId);
future.cancel(true);
log.info("{} had cancel", jobId);
}
} public String getJobId() {
return jobId;
} public void setJobId(String jobId) {
this.jobId = jobId;
} public ConcurrentHashMap<String, Future> getFutureMap() {
return futureMap;
} public void setFutureMap(ConcurrentHashMap<String, Future> futureMap) {
this.futureMap = futureMap;
}
}
}
由于任务是放在队列,在内存里面,所以应用重启会导致任务丢失,如果对于严格要求轮询查询的不合适用这种方式
ScheduledExecutorService调度线程池运行几次后停止某一个线程的更多相关文章
- 原生线程池这么强大,Tomcat 为何还需扩展线程池?
前言 Tomcat/Jetty 是目前比较流行的 Web 容器,两者接受请求之后都会转交给线程池处理,这样可以有效提高处理的能力与并发度.JDK 提高完整线程池实现,但是 Tomcat/Jetty 都 ...
- SimpleThreadPool给线程池增加拒绝策略和停止方法
给线程池增加拒绝策略和停止方法 package com.dwz.concurrency.chapter13; import java.util.ArrayList; import java.util. ...
- WPF [调用线程无法访问此对象,因为另一个线程拥有该对象。] 解决方案以及如何实现字体颜色的渐变
本文说明WPF [调用线程无法访问此对象,因为另一个线程拥有该对象.] 解决方案以及如何实现字体颜色的渐变 先来看看C#中Timer的简单说明,你想必猜到实现需要用到Timer的相关知识了吧. C# ...
- WPF解决方案------调用线程无法访问此对象,因为另一个线程拥有该对象
WPF [调用线程无法访问此对象,因为另一个线程拥有该对象.] 解决方案 在这里以播放图片为例进行说明,代码如下: void _Timer_Elapsed(object sender, Elapsed ...
- 解决Java线程池任务执行完毕后线程回收问题
转载请注明出处:http://www.cnblogs.com/pengineer/p/5011965.html 对于经常使用第三方框架进行web开发的程序员来说,Java线程池理所 ...
- Java:多线程,线程池,用Executors静态工厂生成常用线程池
一: newSingleThreadExecutor 创建一个单线程的线程池,以无界队列方式运行.这个线程池只有一个线程在工作(如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它.)此线程池 ...
- 第11章 Windows线程池(1)_传统的Windows线程池
第11章 Windows线程池 11.1 传统的Windows线程池及API (1)线程池中的几种底层线程 ①可变数量的长任务线程:WT_EXECUTELONGFUNCTION ②Timer线程:调用 ...
- python线程池(threadpool)模块使用笔记 .python 线程池使用推荐
一.安装与简介 pip install threadpool pool = ThreadPool(poolsize) requests = makeRequests(some_callable, li ...
- python 之 并发编程(进程池与线程池、同步异步阻塞非阻塞、线程queue)
9.11 进程池与线程池 池子使用来限制并发的任务数目,限制我们的计算机在一个自己可承受的范围内去并发地执行任务 池子内什么时候装进程:并发的任务属于计算密集型 池子内什么时候装线程:并发的任务属于I ...
随机推荐
- [51 Nod 1584] 加权约数和
题意 求∑i=1N∑j=1Nmax(i,j)⋅σ1(ij)\large \sum_{i=1}^N\sum_{j=1}^Nmax(i,j)\cdot\sigma_1(ij)i=1∑Nj=1∑Nmax ...
- noip初赛试题
链接: https://pan.baidu.com/s/1yoOMIUqMRBnBUPprC3o6HQ&shfl=shareset 提取码: m8ns 复制这段内容后打开百度网盘手机App,操 ...
- IntelliJ IDEA 查找两个字符之间任意内容正则表达式
表达式: A.*?B(“.“表示任意字符,“?”表示匹配0个或多个)
- python 字符串方法整理
Python字符串方法 1.大小写转换 1.1 lower.upper lower():小写 upper():大写 1.2 title.capitalize S.title():字符串中所有单词首字母 ...
- dbt 0.13.0 新添加特性sources 试用
dbt 0.13 添加了一个新的功能sources 我呢可以用来做以下事情 从基础模型的源表中进行数据选择 测试对于源数据的假设 计算源数据的freshness source 操作 定义source ...
- Nodejs中的JavaScript
一.Ecmascript ①基本语法:if var function Object Array等 ②特别注意:Node.js中没有DOM和BOM 二.核心模块: 1.Node.js为JavaScrip ...
- sublime text 3 安装、添加命令行启动、汉化、注册码
1. 安装sublime: 下载:http://www.sublimetext.com/3 添加命令行启动:设置环境变量->计算机->右键属性->高级系统设置->环境变量-&g ...
- Java基础教程(全代码解析)
字面量: 整数字面量为整型(int) 小数字面量为双精度浮点型(double) 数据类型: byte short int long float double 接下来代码展示理解 public clas ...
- Sparrow-WiFi:一款Linux平台下的图形化WiFi及蓝牙分析工具
工具概述 Sparrow-wifi本质上一款针对下一代2.4GHz和5GHz的WiFi频谱感知工具,它不仅提供了GUI图形化用户界面,而且功能更加全面,可以代替类似inSSIDer和linssid之类 ...
- Learning Context Graph for Person Search
Learning Context Graph for Person Search 2019-06-24 09:14:03 Paper:http://openaccess.thecvf.com/cont ...