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中实现了线程同步的代码!!!

原文地址:https://www.cnblogs.com/ssh-html/p/11070683.html

时间: 2024-10-08 12:25:28

Java中的线程--并发库中的集合的相关文章

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

1.  HashSet与HashMap的联系与区别? 区别:前者是单列后者是双列,就是hashmap有键有值,hashset只有键: 联系:HashSet的底层就是HashMap,可以参考HashSet的类源码,默认构造方法为: public HashSet(){ map = new HashMap<key,Object> } 就是HashSet只用HashMap的键,而不用他的值,前者的值可以程序员随便指定,反正不用 2.  线程并发库中的集合优路劣之分 HashMap和HashSet如果在

Android多线程研究(7)——Java5中的线程并发库

从这一篇开始我们将看看Java 5之后给我们添加的新的对线程操作的API,首先看看api文档: java.util.concurrent包含许多线程安全.测试良好.高性能的并发构建块,我们先看看atomic包下的AtomicInteger. import java.util.concurrent.atomic.AtomicInteger; public class AtomicIntegerTest { private static AtomicInteger data = new Atomic

线程高级应用-心得5-java5线程并发库中Lock和Condition实现线程同步通讯

1.Lock相关知识介绍 好比我同时种了几块地的麦子,然后就等待收割.收割时,则是哪块先熟了,先收割哪块. 下面举一个面试题的例子来引出Lock缓存读写锁的案例,一个load()和get()方法返回值为空时的情况:load()的返回值是一个代理对象,而get()却是一个实实在在的对象:所以当返回对象为空是,get()返回null,load()返回一个异常对象:具体分析如下: 一个读写锁的缓存库案例:用上面那道面试题分析则很好理解: 线程阻塞问题:运用多个Condition对象解决 2. Lock

Java多线程(四) —— 线程并发库之Atomic

一.从原子操作开始 从相对简单的Atomic入手(java.util.concurrent是基于Queue的并发包,而Queue,很多情况下使用到了Atomic操作,因此首先从这里开始). 很多情况下我们只是需要一个简单的.高效的.线程安全的递增递减方案.注意,这里有三个条件: 简单,意味着程序员尽可能少的操作底层或者实现起来要比较容易: 高效意味着耗用资源要少,程序处理速度要快: 线程安全也非常重要,这个在多线程下能保证数据的正确性. 这三个条件看起来比较简单,但是实现起来却难以令人满意. 通

Java多线程与并发库高级应用-java5线程并发库

java5 中的线程并发库 主要在java.util.concurrent包中 还有 java.util.concurrent.atomic子包和java.util.concurrent.lock子包

【java并发】线程并发库的使用

1. 线程池的概念 在java5之后,就有了线程池的功能了,在介绍线程池之前,先来简单看一下线程池的概念.假设我开了家咨询公司,那么每天会有很多人过来咨询问题,如果我一个个接待的话,必然有很多人要排队,这样效率就很差,我想解决这个问题,现在我雇几个客服,来了一个咨询的,我就分配一个客服去接待他,再来一个,我再分配个客服去接待--如果第一个客服接待完了,我就让她接待下一个咨询者,这样我雇的这些客服可以循环利用.这些客服就好比不同的线程,那么装这些线程的容器就称为线程池. 2. Executors的

Java复习——多线程与并发库

开启一个线程 实现一个线程的方式有两种:继承Thread类.实现Runnable接口.这两种方法都需要重写Run方法,具体的线程逻辑代码写在Run方法中.其实Thread类就实现了Runnable接口,但是并没有什么说法是使用哪种方式存在效率高低的问题,推荐使用实现Runnable接口的方式,因为更加面向对象,而且实现一个接口比继承一个类更灵活.我们可以使用匿名内部类的方式很方便的开启一个线程(使用Tread类的start方法开启一个线程): Thread : new Thread(){ pub

线程高级应用-心得4-java5线程并发库介绍,及新技术案例分析

1.  java5线程并发库新知识介绍 2.线程并发库案例分析 1 package com.itcast.family; 2 3 import java.util.concurrent.ExecutorService; 4 import java.util.concurrent.Executors; 5 import java.util.concurrent.TimeUnit; 6 7 public class ThreadPoolTest { 8 9 /** 10 * @param args

9.Java5线程并发库的应用

1 import java.util.concurrent.ExecutorService; 2 import java.util.concurrent.Executors; 3 import java.util.concurrent.TimeUnit; 4 5 /** 6 * java5线程并发库的应用 7 * 线程池工具类 Executors 8 * 9 * @author LiTaiQing 10 * 11 */ 12 public class ThreadPoolTest { 13 14