Java中的线程--并发库中的集合

Posted ssh-html

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java中的线程--并发库中的集合相关的知识,希望对你有一定的参考价值。

  线程中的知识点基本都已经学完了,看看Java5并发库中提供的集合。。。

一、可堵塞队列

队列包含固定长度的队列和不固定长度的队列

ArrayBlockQueue中只有put()方法和take()方法才具有阻塞功能

1、阻塞队列的功能和效果,代码如下:

 1 import java.util.concurrent.ArrayBlockingQueue;
 2 import java.util.concurrent.BlockingQueue;
 3 
 4 /**
 5  * @className: BlockingQueueTest
 6  * @description: 可阻塞队列的应用
 7  * @author: ssc
 8  * @date: 2019年6月22日 上午11:07:22
 9  */
10 public class BlockingQueueTest 
11 
12     public static void main(String[] args) 
13         BlockingQueue queue = new ArrayBlockingQueue(3);
14         for (int i = 0; i < 2; i++) 
15             new Thread() 
16                 @Override
17                 public void run() 
18                     while (true) 
19                         try 
20                             Thread.sleep((long) (Math.random() * 10000));
21                             System.out.println(Thread.currentThread().getName() + "准备放数据");
22                             // 往对列中放数据
23                             queue.put(1);
24                             System.out.println(Thread.currentThread().getName() + "已经放了数据,队列目前有" + queue.size() + "个数据");
25                          catch (Exception e) 
26                             e.printStackTrace();
27                         
28                     
29                 
30             .start();
31         
32         
33         new Thread() 
34             @Override
35             public void run() 
36                 while (true) 
37                     try 
38                         Thread.sleep(10000);
39                         System.out.println(Thread.currentThread().getName() + "准备取数据");
40                         // 从队列中取出数据
41                         queue.take();
42                         System.out.println(Thread.currentThread().getName() + "已经取走数据,队列目前有" + queue.size() + "个数据");
43                      catch (Exception e) 
44                         e.printStackTrace();
45                     
46                 
47             
48         .start();
49         
50     
51 
52 

2、堵塞队列来实现通知的功能

 代码示例如下:

 1 import java.util.concurrent.ArrayBlockingQueue;
 2 import java.util.concurrent.BlockingQueue;
 3 
 4 public class Business 
 5 
 6     private BlockingQueue<Integer> queue1 = new ArrayBlockingQueue<Integer>(1);
 7     private BlockingQueue<Integer> queue2 = new ArrayBlockingQueue<Integer>(1);
 8     
 9     // 这种写法是匿名构造方法 它在构造方法中优先级是最高的,所有构造方法之前首先执行
10     
11         try 
12             queue2.put(1);
13          catch (InterruptedException e) 
14             e.printStackTrace();
15         
16     
17     public void sub(int i) 
18 
19         try 
20             // 队列1 要放入值
21             queue1.put(1);
22             for (int j = 1; j <= 10; j++) 
23                 System.out.println("sub thread sequece of " + j + ", loop of " + i);
24             
25             // 队列2 要把值取出来
26             queue2.take();
27             
28          catch (InterruptedException e) 
29             e.printStackTrace();
30         
31     
32 
33     public void main(int i) 
34         try 
35             queue2.put(1);
36             for (int j = 1; j <= 100; j++) 
37                 System.out.println("main thread sequece of " + j + ", loop of " + i);
38             
39             queue1.take();
40          catch (InterruptedException e) 
41             e.printStackTrace();
42         
43         
44     
45 

二、同步集合(并发集合)类

传统集合在并发访问时是有问题的

Java5中提供了一些同步集合类:

ConcurrentMap

CopyOnWriteArrayList

CopyOnWriteArraySet

就是这些集合类是线程安全的,即使在多线程的环境下,也不会存在并发问题,用法是和基本的集合类是一样的,只不过JDK中实现了线程同步的代码!!!

 

以上是关于Java中的线程--并发库中的集合的主要内容,如果未能解决你的问题,请参考以下文章

线程高级应用-心得8-java5线程并发库中同步集合Collections工具类的应用及案例分析

Java中的集合和线程安全

Java中的程序进程线程

java并发:CopyOnWriteArrayList简单理解

java并发编程之美-阅读记录1

java中的ConcurrentHashMap