ConcurrentLinkedQueue代替LinkedBlockingQueue当做任务队列

package com.example.testsb;

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

@Slf4j
public class testClq {
    private static final ConcurrentLinkedQueue<Integer> queue = new ConcurrentLinkedQueue<>();

    public static void main(String[] args) throws Exception {
        // 逻辑线程定时执行
        ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
        scheduledExecutorService.scheduleAtFixedRate(() -> {
            Integer num = queue.poll();

            while (num != null) {
                log.info("num={}", num);
                num = queue.poll();
            }

        }, 200, 200, TimeUnit.MILLISECONDS);


        for (int i = 0; i < 2; i++) {
            for (int j = 0; j < 100; j++) {
                queue.add(j);
            }
            TimeUnit.MILLISECONDS.sleep(50);
        }
    }
}

/*
[2024-04-15 01:48:49.056] [pool-2-thread-1] [testClq.java:21] ([INFO][com.example.testsb.testClq] num=0
[2024-04-15 01:48:49.060] [pool-2-thread-1] [testClq.java:21] ([INFO][com.example.testsb.testClq] num=1
[2024-04-15 01:48:49.061] [pool-2-thread-1] [testClq.java:21] ([INFO][com.example.testsb.testClq] num=2
[2024-04-15 01:48:49.061] [pool-2-thread-1] [testClq.java:21] ([INFO][com.example.testsb.testClq] num=3
[2024-04-15 01:48:49.061] [pool-2-thread-1] [testClq.java:21] ([INFO][com.example.testsb.testClq] num=4
[2024-04-15 01:48:49.061] [pool-2-thread-1] [testClq.java:21] ([INFO][com.example.testsb.testClq] num=5
[2024-04-15 01:48:49.061] [pool-2-thread-1] [testClq.java:21] ([INFO][com.example.testsb.testClq] num=6
[2024-04-15 01:48:49.062] [pool-2-thread-1] [testClq.java:21] ([INFO][com.example.testsb.testClq] num=7
[2024-04-15 01:48:49.062] [pool-2-thread-1] [testClq.java:21] ([INFO][com.example.testsb.testClq] num=8
[2024-04-15 01:48:49.062] [pool-2-thread-1] [testClq.java:21] ([INFO][com.example.testsb.testClq] num=9
[2024-04-15 01:48:49.062] [pool-2-thread-1] [testClq.java:21] ([INFO][com.example.testsb.testClq] num=10
[2024-04-15 01:48:49.062] [pool-2-thread-1] [testClq.java:21] ([INFO][com.example.testsb.testClq] num=11
[2024-04-15 01:48:49.063] [pool-2-thread-1] [testClq.java:21] ([INFO][com.example.testsb.testClq] num=12
[2024-04-15 01:48:49.063] [pool-2-thread-1] [testClq.java:21] ([INFO][com.example.testsb.testClq] num=13
[2024-04-15 01:48:49.063] [pool-2-thread-1] [testClq.java:21] ([INFO][com.example.testsb.testClq] num=14
[2024-04-15 01:48:49.063] [pool-2-thread-1] [testClq.java:21] ([INFO][com.example.testsb.testClq] num=15
...
 */

思考:

        之所以用这个是因为,我们希望每个线程都有机会执行到任务,并且减少锁的使用提高效率。

        在一个线程有任务的时候进行执行,没有任务的时候,让出cpu,让其它线程执行。

------------------------------

学习笔记:

        1.并发容器、基于链表、单线链表。

        2.LinkedBlockingQueue原理是:这种阻塞队列底层是用LockSupport实现,并且依赖锁的阻塞与唤醒。

        3.CAS+volatile:保证线程安全

        可以看出来,在java中其实并发容器的实现就2种:

                一种就是:锁+唤醒机制。

                另一种就是:cas+volatile,毕竟cas是用于赋值用的,跟可见性没什么关系。

                其实还是:悲观和乐观的2种实现方式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值