定时线程池ScheduledThreadPool

1、定长线程池
ScheduledExecutorService es = Executors.newScheduledThreadPool(1);
1代表线程池的大小。
2、用法

// 线程一
es.scheduleAtFixedRate(() -> {
            try{
                System.out.println("#################" + new Date());
                Thread.sleep(7000);
            } catch(InterruptedException e) {
                e.printStackTrace();
            }
        },0, 5, TimeUnit.SECONDS);

// 线程二
 es.scheduleWithFixedDelay(() -> {
            try{
                System.out.println("###########testTwo" + new Date());
                Thread.sleep(7000);
            } catch(InterruptedException e) {
                e.printStackTrace();
            }
        },0, 5, TimeUnit.SECONDS);

第一个参数 runnable接口
第二个参数 执行之前的延迟时间
第三个参数 循环间隔
第四个参数 时间类型

scheduleWithFixedDelay
从执行完成之后开始计算,5秒后再次执行
scheduleAtFixedRate
从执行开始之后开始计算,如果执行时间小于,那再等时间够五秒执行下一次。如果执行时间大于5秒,则结束后直接执行。

3、线程池大小为1,如果开启两个线程,则线程2会等待
执行顺序 先执行线程1,4秒后执行线程2 ,然后1秒后执行线程1的第二次,立刻执行线程2的第二次
总结:线程先执行所有的请求,最后再执行请求的循环。

4、举例用法

@RestController
public class TestController {

    @Autowired
    private TestService testService;

    @PostConstruct
    private void init(){
        for (int i = 0; i < 20; i++) {

            System.out.println("start #############################@@@@@@@@@@@@@@@@@@@");
            testService.testStart(i + 1);
            System.out.println("end #############################@@@@@@@@@@@@@@@@@@@");
        }
    }
}
@Service
public class TestService {
    private ScheduledExecutorService es = Executors.newScheduledThreadPool(2);
    public void testStart(Integer i){
        es.scheduleWithFixedDelay(() -> {
            try{
                System.out.println(i + "#################" + new Date());
                Thread.sleep(7000);
            } catch(InterruptedException e) {
                e.printStackTrace();
            }
        },0, 3, TimeUnit.MINUTES);
    }
}

5、实际用法

	// 阻塞队列
    private BlockingQueue<String> queue = new LinkedBlockingQueue<>(1000);
    // 创建任务
    private ScheduledExecutorService es = Executors.newScheduledThreadPool(1);
    /**
     * 构造函数,执行execute方法
     */
    public BlockingQueueTask() {
        execute();
    }

    /**
     * 添加信息至队列中
     *
     * @param str
     */
    public void addQueue(String str) {
        queue.add(str);
    }

    /**
     * 初始化执行
     */
    public void execute() {
        //每一分钟执行一次
        es.scheduleWithFixedDelay(() -> {
            try {
                log.info("队列执行循环~");
                // 从队列中获取
                String strTest = queue.take();
                log.info("从队列中获取queue:{}", strTest );
                checkReceipt(strTest );
                log.info("完成队列消费~");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }, 0, 1, TimeUnit.MINUTES);
    }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值