用线程池执行定时任务

Posted1 by 呼延十 on March 29, 2019 Hot:

背景介绍

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

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

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

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

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

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

场景模拟如下:

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

具体实现了:

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

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

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

实现代码

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

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