ScheduledExecutorService调度线程池运行几次后停止某一个线程

开发中偶尔会碰到一些轮询需求,比如我碰到的和银行对接,在做完某一个业务后银行没有同步给到结果,这时候就需要查询返回结果,我们的需求是5分钟一次,查询3次,3次过后如果没有结果则T+1等银行的文件,对于这种任务我们的要求是轮询不是很严格,所以我采取调度线程池方式,如果有查询任务,加入线程池,设置好执行次数及执行时间间隔,具体代码如下:

 1 import org.junit.Test;
 2 import org.slf4j.Logger;
 3 import org.slf4j.LoggerFactory;
 4
 5 import java.util.concurrent.*;
 6
 7
 8 public class LocalTest {
 9
10     private static final Logger log = LoggerFactory.getLogger(LocalTest.class);
11
12     @Test
13     public void test01() throws InterruptedException {
14         ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);
15         ConcurrentHashMap<String, Future> futureMap = new ConcurrentHashMap<>();
16
17         JobTest jobTest1 = new JobTest("job1",futureMap);
18         Future future1 = executorService.scheduleAtFixedRate(jobTest1,1, 5, TimeUnit.SECONDS);
19         futureMap.put(jobTest1.getJobId(),future1);
20
21         JobTest jobTest2 = new JobTest("job2",futureMap);
22         Future future2 = executorService.scheduleAtFixedRate(jobTest2,1, 5, TimeUnit.SECONDS);
23         futureMap.put(jobTest2.getJobId(),future2);
24
25         Thread.sleep(1000L * 30);
26
27         JobTest jobTest3 = new JobTest("job3",futureMap);
28         Future future3 = executorService.scheduleAtFixedRate(jobTest3,1, 5, TimeUnit.SECONDS);
29         futureMap.put(jobTest1.getJobId(),future3);
30
31         JobTest jobTest4 = new JobTest("job4",futureMap);
32         Future future4 = executorService.scheduleAtFixedRate(jobTest4,1, 5, TimeUnit.SECONDS);
33         futureMap.put(jobTest4.getJobId(),future4);
34
35         Thread.sleep(1000L * 300);
36         executorService.shutdown();
37     }
38
39     @Test
40     public void test02() {
41
42     }
43
44     class JobTest implements Runnable {
45
46         private ConcurrentHashMap<String, Future> futureMap;
47         private int count = 0;
48         private String jobId;
49
50         public JobTest(){
51
52         }
53
54         public JobTest(String jobId, ConcurrentHashMap<String, Future> futureMap) {
55             super();
56             this.jobId = jobId;
57             this.futureMap = futureMap;
58         }
59
60         @Override
61         public void run() {
62             count++;
63             log.info("{} count is {}", jobId, count);
64             if (count > 2) {
65                 Future future = futureMap.remove(jobId);
66                 future.cancel(true);
67                 log.info("{} had cancel", jobId);
68             }
69         }
70
71         public String getJobId() {
72             return jobId;
73         }
74
75         public void setJobId(String jobId) {
76             this.jobId = jobId;
77         }
78
79         public ConcurrentHashMap<String, Future> getFutureMap() {
80             return futureMap;
81         }
82
83         public void setFutureMap(ConcurrentHashMap<String, Future> futureMap) {
84             this.futureMap = futureMap;
85         }
86     }
87 }

由于任务是放在队列,在内存里面,所以应用重启会导致任务丢失,如果对于严格要求轮询查询的不合适用这种方式

原文地址:https://www.cnblogs.com/llf369/p/11485604.html

时间: 2024-11-03 12:23:30

ScheduledExecutorService调度线程池运行几次后停止某一个线程的相关文章

JAVA线程池原理源码解析—为什么启动一个线程池,提交一个任务后,Main方法不会退出?

起因 public static void main(String[] args) { ExecutorService service = Executors.newFixedThreadPool(10); service.submit(() -> System.out.println("Hello ")); System.out.println("World"); } 呵呵,执行结果谁都知道,显而易见结论线程池的创建的时候,第一次submit操作会创建Wor

java5线程池详解与Executors类创建不同线程池的用法

java中的线程池是非常重要的,它可以节省资源开销,从而提升程序的性能.向Tomcat等一些web服务器都必须用到线程池.java5中为我们提供了一些应用线程池的API,下面的代码将详解其用法. package hxl.insist; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorSer

第11章 Windows线程池(1)_传统的Windows线程池

第11章 Windows线程池 11.1 传统的Windows线程池及API 11.1.1 传统的线程池对象及对应的API 线程池对象 API 普通任务线程池 QueueUserWorkItem 计时器线程池 CreateTimerQueue(创建线程池) CreateTimerQueueTimer(创建计时器) ChangeTimerQueueTimer DeleteTimerQueueTimer DeteTimerQueueEx 同步对象等待线程池 RegisterWaitForSingle

原生线程池这么强大,Tomcat 为何还需扩展线程池?

前言 Tomcat/Jetty 是目前比较流行的 Web 容器,两者接受请求之后都会转交给线程池处理,这样可以有效提高处理的能力与并发度.JDK 提高完整线程池实现,但是 Tomcat/Jetty 都没有直接使用.Jetty 采用自研方案,内部实现 QueuedThreadPool 线程池组件,而 Tomcat 采用扩展方案,踩在 JDK 线程池的肩膀上,扩展 JDK 原生线程池. JDK 原生线程池可以说功能比较完善,使用也比较简单,那为何 Tomcat/Jetty 却不选择这个方案,反而自己

SimpleThreadPool给线程池增加拒绝策略和停止方法

给线程池增加拒绝策略和停止方法 package com.dwz.concurrency.chapter13; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; public class SimpleThreadPool3 { private final int size; private final int queueSize; private final static int DEFA

关于线程池运行过程中,业务逻辑出现未知异常导致线程中断问题反思

最近在项目研发中的关于线程池应用过程中由于业务逻辑异常导致的线程中断,但程序未中断导致的脏数据问题  话不多说,在最近最新的一个版本发布过程中,业务需要,我们要定期去给客户预留出可用的资源数据,提供客户使用,在版本即将上线前一周测试过程中,遇到的预留资源数据跟实际数据不匹配,刚开始反复检查代码,通过日志调试一直无果,经过不懈努力,最终终于发现是由于线程在跑业务时,抛出未知异常,当前线程中断,然而主程序并未异常,导致最终响应的数据与实际不符.下面我就简答举例说明下这个问题 1.获取资源数据demo

python 之 并发编程(进程池与线程池、同步异步阻塞非阻塞、线程queue)

9.11 进程池与线程池 池子使用来限制并发的任务数目,限制我们的计算机在一个自己可承受的范围内去并发地执行任务 池子内什么时候装进程:并发的任务属于计算密集型 池子内什么时候装线程:并发的任务属于IO密集型 进程池: from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor import time,os,random ? def task(x): print('%s 接客' %os.getpid()) time.

43_2013年11月22日 线程池 Socket(Thread Lock Process 摇奖 线程池ThreadPool)

1>模拟线程池,生产者消费者问题 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace Product { class Program { static void Main(string[] args) { //创建一个池子 MyConncetion[]

Java中合理的停止掉一个线程thread

1.第一种也是最常用的一种就是使用状态位 public class Task extends Thread { private volatile boolean flag= true; public void stopTask() { flag = false; } @Override public void run() { while(flag){ /* do your no-block task */ } } } 这是最经典的安全终止当前thread的方式,结构简单精炼,推荐使用.但这种方式