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种实现方式。