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 }

由於任務是放在隊列,在內存里面,所以應用重啟會導致任務丟失,如果對於嚴格要求輪詢查詢的不合適用這種方式


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM