(juc系列)用线程池执行定时任务

背景介绍

还是年轻啊,知识储备严重不足.

今天大佬让我实现以下XXX.

每次用户请求都会判断当前值在不在集合里面,集合数据来自于数据库,不用做缓存,每隔几分钟从数据库load一下数据放到内存就行.

我一脸懵逼,操作内存?我不会啊.

而且没有用spring框架,我也不会定时任务啊…Timer什么的记不住要现场查一下吗?

然后大佬帮我写了一下…..我现在来复习一下.

场景模拟如下:

每隔X段时间,随机生成一些随机数放到内存中.会有用户请求接口来查看某个值是否在其中.

具体实现了:

每隔5s,随机生成3个随机数替换掉原来的,然后启动一个死循环不断判断2是否在这次的list中.
``

其实比较简单,当时一脸懵逼没想起来,也是对已有知识掌握的不够熟悉.

  1. 放进内存问题. 这个其实直接new个list就好,就在内存里面啊….
  2. 定时任务,用Java的定时线程池来解决.

实现代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package daily;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference;

/**
* Created by pfliu on 2019/03/29.
*/
public class ScheduleThreadTest {

private static final AtomicReference<List<Integer>> list = new AtomicReference<>(new ArrayList<>());

public static void main(String[] args) throws InterruptedException {
// 线程池执行定时任务
ScheduledThreadPoolExecutor schedule = new ScheduledThreadPoolExecutor(1);

schedule.scheduleWithFixedDelay(() -> {
// 每隔5秒生成3个1-10的数字,放进list里面
List<Integer> integers = new ArrayList<>();
for (int i = 0; i < 3; ++i) {
integers.add(new Random().nextInt(10));
}
list.set(integers);
System.out.println("now list = " + integers.toString());

}, 0, 5, TimeUnit.SECONDS);

// 测试程序,每一秒测试一下2是否在当前的list中.
while (true) {
int target = 2;
System.out.println(list.get().contains(target));
Thread.sleep(1000);
}
}

}

要活学活用啊亲.

完.





ChangeLog

2019-01-28

以上皆为个人所思所得,如有错误欢迎评论区指正。

欢迎转载,烦请署名并保留原文链接。

联系邮箱:huyanshi2580@gmail.com

更多学习笔记见个人博客——>呼延十