Java并发集合
List,Set,Map在遍历过程中是不允许更新操作的(增,删,该);
非阻塞式集合(Non-Blocking Collection) ConcurrentLinkedDeque:
这类集合包括添加和移除数据的方法。如果方法不能立即被执行,则返回null或抛出异常,但是调用这个方法的线程不会被阻塞。
阻塞式集合(Blocking Collection) LinkedBlockingDeque:
阻塞式集合(Blocking Collection):这类集合包括添加和移除数据的方法。当集合已满或为空时,被调用的添加或者移除方法就不能立即被执行,那么调用这个方法的线程将被阻塞,一直到该方法可以被成功执行。
非阻塞式集合类的使用示例:
1 /**
2 * 非阻塞式并发集合
3 * 添加大量的数据到一个列表中;
4 * 从同一个列表中移除大量的数据。
5 * @author Administrator
6 *
7 */
8 public class CollectionDemo01 {
9
10 public static void main(String[] args) throws Exception {
11 //使用多线程环境下非阻塞的集合类
12 ConcurrentLinkedDeque<String> list = new ConcurrentLinkedDeque<>();
13
14 //添加数据
15 Thread[] add = new Thread[100];
16 for (int i = 0; i < add.length; i++) {
17 add[i] = new Thread(()->{
18 for (int j = 0; j < 10000; j++) {
19 list.add(Thread.currentThread().getName()+":Element "+j);
20 }
21 });
22 add[i].start();
23 add[i].join();
24 }
25 System.out.println("after add size"+list.size());
26 //移除数据
27 Thread[] poll = new Thread[100];
28 for (int i = 0; i < poll.length; i++) {
29 poll[i] = new Thread(()->{
30 for (int j = 0; j < 5000; j++) {
31 //移除尾部
32 list.pollLast();
33 //移除头部
34 list.pollFirst();
35 }
36 });
37 poll[i].start();
38 poll[i].join();
39 }
40 System.out.println("after poll size:"+list.size());
41 }
42
43 }
阻塞式集合类的使用示例:
1 /**
2 * 阻塞式并发集合
3 * @author Administrator
4 *
5 */
6 public class CollectionDemo02 {
7
8 public static void main(String[] args) {
9 //使用多线程下的阻塞式并发集合类
10 LinkedBlockingDeque<String> list = new LinkedBlockingDeque<>(5);
11 //添加数据
12 Thread thread = new Thread(()->{
13 for (int i = 0; i < 3; i++) {
14 for (int j = 0; j < 5; j++) {
15 String str = new String(i+":"+j);
16 try {
17 list.put(str.toString());
18 System.out.println("client:"+str+(new Date()));
19 } catch (InterruptedException e) {
20 e.printStackTrace();
21 }
22 }
23 }
24 });
25 thread.start();
26
27 //取数据
28 for (int i = 0; i < 5; i++) {
29 for (int j = 0; j < 3; j++) {
30 try {
31 System.out.println("main:before take size:"+list.size());
32 //从集合中取出数据
33 String str = list.take();
34 System.out.println("main:after take"+str+" size:"+list.size());
35 } catch (InterruptedException e) {
36 e.printStackTrace();
37 }
38 try {
39 TimeUnit.SECONDS.sleep(2);
40 } catch (InterruptedException e) {
41 e.printStackTrace();
42 }
43 }
44 }
45 System.out.println("end=========");
46 }
47 }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· Blazor Hybrid适配到HarmonyOS系统
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· 分享4款.NET开源、免费、实用的商城系统
· 解决跨域问题的这6种方案,真香!
· 一套基于 Material Design 规范实现的 Blazor 和 Razor 通用组件库