zoukankan      html  css  js  c++  java
  • 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中实现了线程同步的代码!!!

  • 相关阅读:
    docker 安装mysql
    Java web项目搭建系列之二 Jetty下运行项目
    Java web项目搭建系列之一 Eclipse中新建Maven项目
    Maven 添加其他Maven组件配置问题
    C# 中定义扩展方法
    Oracle 函数
    【Webservice】2 counts of IllegalAnnotationExceptions Two classes have the same XML type name
    Linux精简版系统安装网络配置问题解决
    Rsync 故障排查整理
    Failed to set session cookie. Maybe you are using HTTP instead of HTTPS to access phpMyAdmin.
  • 原文地址:https://www.cnblogs.com/ssh-html/p/11070683.html
Copyright © 2011-2022 走看看