zoukankan      html  css  js  c++  java
  • java并发操作

    项目中常用的java并发操作

    一、java8新特性java并发流操作(结合纳姆达表达式)

           List<String> list = new ArrayList<>();

            list..stream().parallel().forEach(list1 ->{

      // 调用方法 method

    });

          注:其中list1为list一个子集。然后通过java流(steam)操作并发(parellel),同时开启多个线程去执行方法(method);

    所以当一个线程执行完成之后会继续执行集合中另外的子集,直到list循环结束。

    二、采用阻塞队列的形式

      1、List<Qcbatch> qcBatchList = new ArrayList<>();

      注:QcBatch  为一个对象,此处为一个示例,然后在qcBatchList 集合中放入自己的元素

      2、// 创建阻塞队列跑批

      ConcurrentLinkedQueue<QcBatch> queue = new ConcurrentLinkedQueue<>(); // 线程同步的队列
      queue.addAll(qcBatchList );
      int count = 10; // 此处为设置线程数位10
      final CountDownLatch countDownLatch = new CountDownLatch(count); //将线程放入计数器中
      注:CountDownLatch是Java1.5之后引入的Java并发工具类,放在java.util.concurrent包下,CountDownLatch能够使一个或多个线程等待其他线程完成 各自的工作后再执行
      3.循环操作线程
      for (int i = 0; i < count; i++) {
        new Thread(() -> {
        CheckResult<QcBatch> t;
        try {
        // queue.poll 从队列中删除第一个元素,知道为空,会返回null对象(与remove()有些不同)
        while ((t = queue.poll()) != null) {
        // 此处调用自己的业务逻辑
        }
        } finally {
        countDownLatch.countDown(); // 每调用一次这个方法,在构造函数中初始化的count值就减1
          //所以当N个线程都调 用了这个方法,count的值等于0,然后主线程就能通过await()方法,恢复执行自己的任务。
        }
      }).start();
      }
      countDownLatch.await(); // 等待所有跑批线程执行结束

     两种方式比较:第一种方式是每个线程各自执行,任务会有先后顺序;

           第二种方式是等时执行,在效果上是同一时间完成10个任务;

           所以我们在实际项目中要根据不同的情况来选择哪种方式

  • 相关阅读:
    C# 从服务器下载文件
    不能使用联机NuGet 程序包
    NPOI之Excel——合并单元格、设置样式、输入公式
    jquery hover事件中 fadeIn和fadeOut 效果不能及时停止
    UVA 10519 !! Really Strange !!
    UVA 10359 Tiling
    UVA 10940 Throwing cards away II
    UVA 10079 Pizze Cutting
    UVA 763 Fibinary Numbers
    UVA 10229 Modular Fibonacci
  • 原文地址:https://www.cnblogs.com/dfys/p/10874377.html
Copyright © 2011-2022 走看看