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个任务;

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

  • 相关阅读:
    【TFLSnoi李志帅】第⑥篇文章---排序
    【TFLSnoi李志帅】第⑤篇文章--递推算法经典例题
    【TFLSnoi李志帅】第四篇文章---高精度加法
    【TFLSnoi李志帅】第三篇文章
    【TFLSnoi李志帅】第三篇文章---问题记录
    【TFLSnoi李志帅】第一篇文章
    为什么成功引入jquery后,效果无法生效
    到底classpath指向哪里
    05-配置web.xml
    04-配置事务管理
  • 原文地址:https://www.cnblogs.com/dfys/p/10874377.html
Copyright © 2011-2022 走看看