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個任務;

       所以我們在實際項目中要根據不同的情況來選擇哪種方式


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM